2011-01-25 14 views
60

मान लीजिए कि हम इतनी तरह एक संरचना है दो:घोंसला किया गया है एक बुरा विचार ब्लॉक/कैच ब्लॉक?

Try 
    ' Outer try code, that can fail with more generic conditions, 
    ' that I know less about and might not be able to handle 

    Try 
    ' Inner try code, that can fail with more specific conditions, 
    ' that I probably know more about, and are likely to handle appropriately 
    Catch innerEx as Exception 
    ' Handle the inner exception 
    End Try 

Catch outerEx as Exception 
    ' Handle outer exception 
End Try 

मैं कुछ राय है कि घोंसला बनाने से Try ब्लॉक इस तरह हतोत्साहित किया जाता है देखा है, लेकिन मैं किसी भी विशिष्ट कारणों नहीं पा सके।

क्या यह बुरा कोड है? यदि हां, तो क्यों?

+2

यह सुनिश्चित नहीं है कि स्निपेट वास्तव में कितना सटीक है। लेकिन जब आप अपवाद पकड़ते हैं तो वास्तव में कोई हेकोफ्लोट नहीं होता है। यह * कुछ * हो सकता है। जब VB.NET का समर्थन करता है तो उस खंड का लाभ उठाने पर विचार करें। –

उत्तर

63

कुछ परिस्थितियां हैं जहां वे एक अच्छा विचार हैं, उदा। एक पूरी विधि के लिए कोशिश करें/पकड़ें और एक लूप के अंदर एक और जब आप अपवाद को संभालना चाहते हैं और शेष संग्रह को संसाधित करना चाहते हैं।

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

उस ने कहा, अपवाद केवल यही होना चाहिए - असाधारण। एक कार्यक्रम उन्हें संभालना चाहिए लेकिन सामान्य निष्पादन प्रवाह के हिस्से के रूप में उनसे बचने की कोशिश करें। वे में सबसे अधिक भाषाओं में गणितीय रूप से महंगा हैं (पायथन एक उल्लेखनीय अपवाद है)।

एक अन्य तकनीक है जो उपयोगी विशिष्ट प्रकार के अपवाद बढ़ रहा है हो सकता है ...

Try 
    'Some code to read from a file 

Catch ex as IOException 
    'Handle file access issues (possibly silently depending on usage) 
Catch ex as Exception 
    ' Handle all other exceptions. 
    ' If you've got a handler further up, just omit this Catch and let the 
    ' exception propagate 
    Throw 
End Try 

के रूप में टिप्पणी में गूच ने बताया नीचे, हम भी हमारे त्रुटि हैंडलिंग दिनचर्या में नेस्टेड ट्राई/कैच का उपयोग .. ।

Try 
     Try 
      'Log to database 
     Catch ex As Exception 
      'Do nothing 
     End Try 

     Try 
      'Log to file 
     Catch ex As Exception 
      'Do nothing 
     End Try 
    Catch ex As Exception 
     'Give up and go home 
    End Try 
+7

पृष्ठभूमि धागे में लॉग इन करना एक जगह है जहां मैं एक आंतरिक प्रयास/पकड़ का उपयोग करूंगा। मैं नहीं चाहता कि विधि समाप्त हो रही है क्योंकि यह दस्तावेज नहीं कर सका कि वह क्या कर रहा था। – gooch

+0

@ गुच सच है, मैं यह भी करता हूं, मैं इसे अपने उत्तर में जोड़ दूंगा। – Basic

31

मैं वास्तव में क्या नेस्ट Try/Catch ब्लॉकों के बारे में स्वाभाविक गलत है, सिवाय इसके कि वे नेविगेट करने में कठिन हो सकता है और संभावना है एक संकेत है कि आप कुछ पुनर्रचना (भीतरीकर सकता हैं कर सकते हैं नहीं लगता है 10/Catch उदाहरण के लिए, अपनी विधि में)।

लेकिन मैं इस टिप्पणी को संबोधित करने के लिए चाहते हैं:

' Outer try code, that can fail with more generic conditions, 
' that I know less about and might not be able to handle 

आप कैसे किसी विशेष स्थिति में अपवाद को संभालने के लिए पता नहीं है, मुझ पर भरोसा: पकड़ उन्हें नहीं है। अपने ऐप को क्रैश करने के लिए बेहतर (मेरा मतलब है, आपको पता है, लॉग लॉग इन करें; बस इसे निगलें नहीं) कुछ ऐसा करने के लिए जो आपको नहीं पता कि कैसे से पुनर्प्राप्त किया जाए और फिर अपने ऐप को अपने रास्ते पर आसानी से जारी रखें दूषित राज्य उस बिंदु से व्यवहार सबसे अच्छा अप्रत्याशित होगा।

+0

यह सच है। बाहरी अपवाद को पकड़ने के बिंदु पर मैं जारी नहीं रखना चाहूंगा। मैं आवेदन को बंद करने/पुन: प्रारंभ करने में सक्षम होने के बारे में और सोच रहा था, और उपयोगकर्ता को "बदसूरत दुर्घटना" – Goro

+9

@Goro के साथ झटका नहीं देता: उस स्थिति में मैं एक ऐप-व्यापी अपवाद हैंडलिंग तंत्र की सिफारिश करता हूं (उदाहरण के लिए, यदि यह WinForms है , प्रति-विधि 'कोशिश करें'/'कैच 'ब्लॉक के बजाय' Application.UnhandledException' ईवेंट) को संभाल लें। –

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