2012-10-02 13 views
8

में अपवाद उपयोग के विपक्ष मैं exception उपयोग और NSError उपयोग पर एप्पल सिफारिश पढ़ें।पेशेवरों और iOS/ObjectiveC

Exception Handeling in iOS

Using exceptions in Objective-C

Objective-C Exceptions

मैं आईओएस (सच कहूं, मैं एप्पल के वाक्य के साथ कोई संतुष्ट हूँ में विधि से निपटने त्रुटि अधिसूचना के रूप में पेशेवरों और उपयोग अपवाद के विपक्ष यह पता लगाने की कोशिश कर रहा हूँ/(यह कहता है कि क्या करना है, लेकिन यह नहीं कहता कि हमें ऐसा क्यों करना चाहिए):

आपको उपयोग को आरक्षित करना चाहिए प्रोग्रामिंग के लिए अपवादों या अप्रत्याशित रनटाइम त्रुटियों जैसे कि ऑफ-ऑफ-बाउंड संग्रह एक्सेस, अपरिवर्तनीय ऑब्जेक्ट्स को म्यूट करने, अमान्य संदेश भेजने और विंडो सर्वर से कनेक्शन खोने का प्रयास करता है। आप आमतौर पर पर अपवाद के साथ इस तरह की त्रुटियों का ख्याल रखते हैं जब कोई अनुप्रयोग रनटाइम के बजाए बनाया गया है।

अपवाद उपयोग पेशेवरों:

  • यह त्रुटि पैदा कोड और त्रुटि हैंडलिंग कोड के बीच सभी मध्यवर्ती कोड

  • यह तर्क को दूषित नहीं करता संशोधित करने और के लिए मान वापस जाने के लिए की आवश्यकता नहीं है तरीकों

विपक्ष:

  • सभी मैन्युअल रूप से प्रबंधित मेमोरी कोड के लिए हमें अतिरिक्त सावधान रहना होगा (हमें यह सुनिश्चित करने के लिए ऑटोरेलीज़िंग ऑब्जेक्ट्स में लपेटने की आवश्यकता होगी कि संसाधन जारी किए जाएंगे)।

  • हमें अपने कोड और ढांचे के बीच सीमा से सावधान रहना होगा। यदि हमारे अपवाद हमारे कोड को छोड़ देते हैं, तो हम परेशानी में पड़ सकते हैं (क्योंकि ढांचे मैन्युअल रूप से स्मृति का प्रबंधन कर सकते हैं)

क्या मुझे कुछ याद आया? क्या अतिरिक्त विपक्ष/पेशेवर हैं?

ऐसा लगता है जैसे अपवादों को लाइब्रेरी जैसे कोड के लिए ठीक होना चाहिए (जब हमारे पास कड़े पैक किए गए कोड की बड़ी मात्रा होती है, जो बाहरी सिस्टम/ढांचे के साथ बहुत कुछ संवाद नहीं करती है। और ऐसा लगता है कि अपवाद का उपयोग करना मुश्किल है । कोड जो सक्रिय रूप से अन्य चौखटे के साथ सूचना का आदान प्रदान

अपने अनुभव इस सिद्धांत को साबित करता है

मैं इस विषय पर किसी भी अतिरिक्त जानकारी की सराहना करते हैं

+1

मैं वास्तव में विपक्ष को नहीं देखता हूं। आप इन दो चीजों को वैसे भी करना चाहते हैं, है ना? – Sulthan

+0

मैं कहूंगा, पहले वास्तव में एक कॉन नहीं है। आपको वैसे भी करना है। दूसरा दर्दनाक हो सकता है (जैसा कि मैं समझता हूं कि ObjectiveC (जावा) विकसित करने के लिए एक अच्छा तरीका प्रदान नहीं करता है, यह जानने के लिए कि कुछ विधि फेंक सकती है। इसलिए, सीमा कोड में केवल एक विधि जोड़ना और भूलना आसान है अपवाद को पकड़ने के लिए जिसे इस कोड द्वारा फेंक दिया जा सकता है। –

+0

समस्या यह है कि, हालांकि, आपके कोड और सिस्टम कोड के बीच की सीमा आमतौर पर बेहद जटिल है। यदि आप फाउंडेशन संग्रह कक्षाओं का उपयोग करते हैं, तो उन संग्रहों का हर उपयोग एक सीमा है, उदाहरण के लिए। – bbum

उत्तर

13

tl;?। डॉ अपवाद घातक/गैर वसूली योग्य के लिए इस्तेमाल किया जाना चाहिए/प्रोग्रामर त्रुटि केवल।उन्हें ला जावा या अन्य अपवादों का उपयोग करने का प्रयास करने वाले-पुनर्प्राप्ति योग्य वातावरण परिणामस्वरूप कोड को अधिक नाजुक, बनाए रखने में कठोर, और रिफैक्टर के लिए मुश्किल हो सकता है जबकि सिस्टम ढांचे का लाभ उठाने की आपकी क्षमता को सीमित कर दिया जाता है।


कोन: आप प्रवाह नियंत्रण और/या अपने कोड में वसूली योग्य त्रुटियों के लिए अपवाद का उपयोग करते हैं, अपने कोड डिजाइन द्वारा, हो जाएगा, एप्पल के डिजाइन पैटर्न से अलग।

अंतिम परिणाम?

• आप अपने कोड में सभी पर एप्पल के API उपयोग नहीं कर सकते जब तक कि आपके कोड और एप्पल के हमेशा के बीच की सीमा अपवाद व्यवहार

आइसोलेट्स • हर बार जब आपका refactor, आप refactor करना होगा अपवाद हैंडलिंग कोड का एक द्रव्यमान

• कई चीजें जो छोटी होनी चाहिए, बहुत जटिल होंगी; उदाहरण के लिए, आप अपनी ऑब्जेक्ट्स को एक गणना करने योग्य संग्रह में नहीं डाल पाएंगे और उस गणना के बिना उन्हें गणना नहीं करेंगे - ब्लॉक, लूप के लिए, जो कुछ भी ... - सीमाओं पर अपवाद प्रक्रिया भी है।

पर विचार करें:

NSArray *a = @[yourExceptionfulInstance, yourExceptionfulInstance, yourExceptionfulInstance]; 

@try { 
    for(id k in a) { [k doSomething]; } 
} @catch(...) { 
} 

तो doSomething बढ़ाई जा सकती है किसी भी कारण से, ऊपर ढांचे के दस्तावेज डिजाइन पैटर्न का उल्लंघन है, क्योंकि आप (एप्पल के ढांचे के भीतर फ़्रेम में एक अपवाद फेंक दिया जाएगा रों)।

यह एक शक्तिशाली बड़ी बात है। इतना बड़ा है कि मैं कल्पना नहीं कर सकता कि पेशेवरों का एक सेट इससे अधिक है।

+0

अच्छा बिंदु। धन्यवाद। –

संबंधित मुद्दे