2009-04-12 4 views
9

पर विचार करें निम्नलिखित कोको/Obj सी कोड के टुकड़े:कोको के प्रयास/पकड़/आखिरकार अपवाद हैंडलिंग में कौन सा परिस्थितियां @ अनजान गैर-अनावश्यक है?

MyClass *obj; 
@try { 
    [obj doSomething]; 
} 
@catch (NSException * e) { 
    NSLog(@"Exception occurred: %@", [e description]); 
} 
@finally { 
    [obj cleanUp]; 
} 

और

MyClass *obj; 
@try { 
    [obj doSomething]; 
} 
@catch (NSException * e) { 
    NSLog(@"Exception occurred: %@", [e description]); 
} 
[obj cleanUp]; 

किन परिस्थितियों [obj cleanUp] में पहली टुकड़ा परिणाम बुलाया जा रहा है, जबकि दूसरा नहीं होगा परिणाम [obj cleanUp] में कहा जा रहा है? दूसरे शब्दों में, कोको अपवाद हैंडलिंग का उपयोग करते समय @finally गैर-अनावश्यक क्या परिस्थितियों में है?

उत्तर

5

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

यह एक ऐसे मामले को इंगित करने के लायक है जहां आप @finally का उपयोग करने की आवश्यकता नहीं है, जो तब होता है जब आप अपना स्वयं का ऑटोोरलीज पूल सेट करते हैं। जब "पैरेंट" ऑटोरेलीज पूल नष्ट हो जाता है, तो कोई भी आंतरिक जो अभी तक साफ नहीं हुआ है, वह भी होगा। यदि आप इसे स्वयं साफ़ करने का प्रयास करते हैं, तो आपको अपवाद को अपने ऑटोरेलीज पूल से बाहर करने की आवश्यकता है।

+1

एफवाईआई, यहां एप्पल के डॉक्टर का विवरण है कि @ try/@ catch/@ throw/@ के साथ मेमोरी प्रबंधन कैसे करें, अंत में अपवाद हैंडलिंग: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ अपवाद/कार्य/हैंडलिंग एक्सेप्शन.html # // apple_ref/doc/uid/20000059-SW7 –

1

जब:

  • आप अपवाद के प्रकार जो हुआ
  • आप अपवाद पकड़ा, लेकिन पकड़ ब्लॉक में कोड भी एक अपवाद फेंकता पकड़ने नहीं कर रहे हैं।
15

उन परिदृश्यों में कोई अंतर नहीं है क्योंकि अपवाद निगल लिया गया है। यहाँ दो परिदृश्य हैं जहां है एक अंतर:

[obj सफाई] कहा जाता है:

MyClass *obj; 
@try { 
    [obj doSomething]; 
} 
@catch (NSException * e) { 
    @throw;  
} 
@finally { 
    [obj cleanUp]; // called when exception is caught 
} 

[obj सफाई] कहा जाता है नहीं है:

MyClass *obj; 
@try { 
    [obj doSomething]; 
} 
@catch (NSException * e) { 
    @throw; 
} 
[obj cleanUp]; // not called when exception is caught 
0

एक निचले स्तर सवाल, आप ऐसा क्यों कर रहे हो?

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

सबसे व्यापक रूप से उपयोग और समझा जाने वाला सम्मेलन एक ऐसे प्रतिनिधि का है जिसमें एक त्रुटि विधि कॉलबैक है, या शायद अधिक सामान्य विफलताओं के लिए अधिसूचनाएं जिन्हें आपको कोड के कई स्तरों के माध्यम से पारित करने की आवश्यकता है। जावा दुनिया में उस दृष्टिकोण का व्यापक रूप से उपयोग किया जा सकता है यदि कोको ने इसे स्थापित करने के तरीके के बारे में एक सरल अधिसूचना प्रणाली की थी।

प्रतिनिधि दृष्टिकोण में जावा में अपवाद घोषित करने के समान दस्तावेज संपत्ति है, वे केवल अलग-अलग दृष्टिकोण हैं, लेकिन आम तौर पर भाषा के लिए अधिक उपयुक्त दृष्टिकोण का उपयोग करना बेहतर होता है जब तक कि अन्यथा ऐसा करने के लिए कोई अनिवार्य कारण न हो।

+0

मैं वर्तमान में ओएस एक्स 10.5 में ऐप्पल के स्क्रिप्टिंग ब्रिज के अपवादों को फेंकने में असफल होने के बाद प्रयास/पकड़/अंत में काम कर रहा हूं। यदि आप स्क्रिप्टिंग ब्रिज का उपयोग करते हैं, तो आप अपवादों से बच नहीं सकते हैं। हालांकि मैं पूरी तरह से सहमत हूं, ज्यादातर कोको/उद्देश्य-सी कोड के लिए, त्रुटियों को संभालने का अपवाद सबसे अच्छा तरीका नहीं है। –

7

यह भी ध्यान देने योग्य बात है जब नियंत्रण किसी भी कारण से के लिए @try ब्लॉक बाहर निकालता है @finally ब्लॉक में है कि कोड चलाया जाएगा, return या goto के माध्यम से भी लायक है। उदाहरण के लिए:

@try { 
    doStuff(); 
    if(bail){ 
     return; 
    } 
    doMoreStuff(); 
} 
@finally { 
    [obj cleanUp]; 
} 
[obj announceSuccess]; 

[obj cleanUp] निष्पादित करेगा, भले ही bail सही है, लेकिन [obj announceSuccess] नहीं होगा।

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