2009-10-01 8 views
10

में लौटने वाली त्रुटियां मैं उद्देश्य-सी के लिए नया हूं और आश्चर्यचकित हूं कि त्रुटियों को संभालने और पकड़ने के लिए सामान्य/मानक/उचित तरीका क्या है?उद्देश्य-सी

ऐसा लगता है कि ऐसा करने के लिए एनएसईआरआरआर का उपयोग करना संभव हो सकता है, क्या यह एक अच्छा विचार या कोको का अपहरण है?

उत्तर

17

मुझे पूरा यकीन है कि एनएसईआरआरआर कक्षा क्या है - त्रुटियों के बारे में विवरण दें। सबसे आम पैटर्न आप देखेंगे एक विधि है कि में के रूप में एक NSError ऑब्जेक्ट के लिए एक सूचक लेता है, यह है:

- (id)doSomethingWithArgument:(id)arg error:(NSError **)error

विधि कुछ करने का परिणाम के लिए कुछ मूल्य (या संभवतः nil) देता है, लेकिन अगर असफलता के बारे में विवरण के साथ पारित सूचक पर एक एनएसईआरआर ऑब्जेक्ट विफल होगा। यदि आपका तरीका किसी त्रुटि का सामना करता है तो क्या लौटाया जाता है यह निर्दिष्ट करने के लिए आपका दस्तावेज़ ज़िम्मेदार है।

दिमाग में आने वाली दूसरी विधि @throw - @catch ब्लॉक है; हालांकि, ऑब्जेक्टिव-सी @throw में एक अपवाद में कंप्यूटेशनल रूप से महंगा हो सकता है, और आमतौर पर इसे वास्तव में असाधारण परिस्थितियों में ऐसा करने की अनुशंसा की जाती है।

संपादित करें: वाह, बहुत से लोगों को @throw आईएनजी अपवादों के बारे में वास्तव में मजबूत राय है। इस मुद्दे पर (काफी उपयोगी) कमेंटरी सारांश में:

  • फेंकने अपवादों को सबसे अधिक बार प्रोग्रामर त्रुटि के साथ सौदा करना चाहिए (स्थितियों कि कभी नहीं करना चाहिए, और की तरह); अपवाद सामान्य त्रुटि हैंडलिंग के लिए उपयोग नहीं किया जाना चाहिए। इसके बजाय, एनएसएनोटिफिकेशन के उदाहरणों को ऊपर या पोस्ट किए गए error विधि का उपयोग करें।
  • यदि आप @throw/@catch ब्लॉक का व्यापक उपयोग करते हैं, तो उनके आस-पास के तर्क के बारे में बहुत सावधान रहें। उद्देश्य-सी अन्य धागे, या निष्पादन में देरी के लिए विधियों को अलग करने के कई तरीके प्रदान करता है। जब आप अपना कोड लिखते हैं तो उन सभी संभावनाओं के लिए बहुत सावधान रहें।

अंत में, एक और बहुत वैध बिंदु:

  • आप error वस्तु एक विधि के लिए पारित का उपयोग करते हैं, वापसी मान यह इंगित करना चाहिए। दोनों को करने की कोशिश न करें (आंशिक रूप से मान्य ऑब्जेक्ट औरerror ऑब्जेक्ट सेट करें) को वापस न करें।
+2

अपने दायरे से बाहर पकड़े गए कुछ को रोकने के लिए ओबीजेसी में बहुत सारे सूक्ष्म तर्क मुद्दे भी हैं। उदाहरण के लिए यदि आपको एनएसटीमर द्वारा बुलाया जाता है तो क्या होगा? अपवाद को पकड़ने के लिए कौन जा रहा है (और दुर्घटनाग्रस्त होने से बचें)? ओबीजेसी अपवाद सामान्य ओबीजेसी मुहावरों को संभालने के लिए पर्याप्त शक्तिशाली नहीं हैं। वे आमतौर पर प्रोग्रामिंग त्रुटियों से निपटने के लिए उपयोगी होते हैं। सामान्य उपयोग के लिए आपको एक समृद्ध त्रुटि वस्तु की आवश्यकता होने पर एनएसईआरआर निश्चित रूप से जाने का सही तरीका है। –

+2

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

+4

इस अवधारणा को जारी रखते हुए, केंद्रीकृत त्रुटि प्रबंधन के विचार कोको में अपवादों की तुलना में बेहतर कार्यान्वयन भी है। मैं अक्सर NSNotifications में त्रुटि फेंकता हूं जो कुछ केंद्रीय त्रुटि हैंडलिंग ऑब्जेक्ट द्वारा उपयोगकर्ता प्रतिक्रिया प्रदान करने के लिए मनाया जाता है। जब पुन: प्रयास तर्क के एनएसईआरआरआर के encapsulation के साथ मिलकर, यह उपयोगकर्ता को प्रभावित त्रुटियों के लिए एक बहुत ही प्रभावी समाधान "अधिसूचना पोस्ट और वापसी" कर सकते हैं। –