2010-04-22 16 views
50

कैच ब्लॉक में वापसी का विवरण गलत है? विकल्प क्या हैं?
यानी:कैच ब्लॉक में वापसी?

public bool SomeFunction() 
{ 
    try 
    { 
     //somecode 
     return true; 
    } 
    catch(Exception ex) 
    { 
     MessageBox.Show(ex.message); 
     return false; 
    } 

} 
+0

यह भी देखें: http://stackoverflow.com/questions/2373560/return-statements-in-catch-blocks, http: // stackoverflow.com/questions/449099/is-it-bad-practice-to-return-from-within-a-try-catch-finally-block, http://stackoverflow.com/questions/1713388/in-the- कोशिश-पकड़-ब्लॉक-यह-खराब-से-वापसी-अंदर-पकड़-जो-अच्छा-व्यावहारिक – outis

+0

यह ठीक है, क्यों नहीं? – Andrey

उत्तर

31

आप पकड़ ब्लॉक से सामान्य रूप से लौट सकते हैं। यह आमतौर पर अच्छा कार्यात्मक कोड है।

0

एक ऐसे फ़ंक्शन के लिए मेरे लिए सही मायने रखता है जो सफलता पर सत्य और विफलता पर गलत साबित होता है। मुझे आशा है कि इसके साथ कुछ भी गलत नहीं है - मैं यह सब समय कर :)

18

एक वैकल्पिक एक अस्थायी चर में वापसी मान स्टोर करने के लिए किया जाएगा:

public bool SomeFunction() 
{ 
    bool success = true; 
    try 
    { 
     //somecode 
    } 
    catch(Exception ex) 
    { 
     MessageBox.Show(ex.message); 
     success = false; 
    } 

    return success; 
} 

लेकिन व्यक्तिगत रूप से, मैं जिस तरह से आप पाते हैं इसे और अधिक पठनीय होने के लिए लिखा है (एक पकड़-पकड़ पकड़ने के साथ)। दूसरी ओर, यदि आप किसी विशिष्ट अपवाद की उम्मीद कर रहे हैं और आप सफलता या नहीं लौटने के लिए अनेक पथों हो सकता है ...

try 
{ 
    DoTheImportantThing(); 
    DoTheOtherThingThatMightFailButWeDontCare(); 
} 
catch (DontCareAboutItException ex) 
{ 
    log.Info(ex); 
} 
catch (Exception ex) 
{ 
    log.Error(ex); 
    return false; 
} 

return true; 

तो मेरी राय में आप के करीब के रूप में वापसी बयान धक्का बंद सबसे अच्छा कर रहे हैं जितना संभव हो अंत।

एप्लिकेशन के आधार पर एक साइड नोट के रूप में, उपयोगकर्ता को दिखाए जाने के बजाय आपके द्वारा प्राप्त अपवादों को लॉगिंग करने पर विचार करें। लॉग अप अपवादों के बारे में उपयोगकर्ता के रिकॉर्ड्स की तुलना में बहुत अधिक विश्वसनीय हैं।

7
public bool SomeFunction() 
{ 
    try 
    { 
     //somecode 
     return true; 
    } 
    catch(Exception ex) 
    { 
     MessageBox.Show(ex.message); 
    } 
    return false; 
} 

व्यक्तिगत रूप से मैंने कैच-ब्लॉक में विधि के नीचे वापसी विवरण दिया। लेकिन दोनों ठीक हैं। यह आपके संगठन में पठनीयता (व्यक्तिपरक) और दिशानिर्देशों के बारे में है।

0

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

8

यह ठीक है, बस ध्यान रखें, कुछ कोड वापसी निर्देश के बाद निष्पादित किया जा सकता है (वापसी मूल्य कैश किया जाएगा)।

try 
    { 
     return; 
    } 
    catch(Exception ex) 
    { 
     return; 
    } 
    finally 
    { 
     //some code 
    } 
9

होती है, तो कोशिश ब्लॉक में पहले से ही एक वापसी कथन शायद मैं समारोह के अंत में अन्य वापसी डाल होगा:

try 
{ 
    //somecode 
    return true; 
} 
catch(Exception ex) 
{ 
    MessageBox.Show(ex.message); 
} 
return false; 

और यह क्रम कई रिटर्न से बचने के लिए यदि एक से अधिक अपवाद की जरूरत है संभालने के लिए।

+0

यदि मैं पकड़ के अंदर रिटर्न डालने के पैटर्न का पालन करता हूं, तो संकलक मुझे त्रुटि के साथ याद दिलाएगा अगर किसी भी तरह से रिफैक्टरिंग के दौरान मैं गलती से कोशिश के अंदर अपना रिटर्न स्टेटमेंट हटा देता हूं। लेकिन अगर मैं पकड़ के बाद वापसी करता हूं तो कोड संकलित हो जाएगा और यह प्रोड में समाप्त हो सकता है। – Unnie

2

यह गलत नहीं है, लेकिन यदि आप संसाधन का उपयोग करते हैं, तो आम तौर पर बंद करने के लिए इसे बंद करने के बजाय अंततः ब्लॉक को बंद करने के लिए उपयोग किया जाता है। उस स्थिति में, आप आखिरकार ब्लॉक के बाद रिटर्न स्टेटमेंट का उपयोग करना चुन सकते हैं।

+5

'आखिरकार' अभी भी कोशिश ब्लॉक में वापसी के साथ निष्पादित होगा। – fearofawhackplanet

+1

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

2

हां, यह बिल्कुल सामान्य है।

भूलें, कि आप का उपयोग कर सकते हैं अंत में ब्लॉक को वापस करने के बाद निष्पादित किया जा सकता है।

+2

और इसलिए कोड को पढ़ना मुश्किल होगा क्योंकि वापसी के बाद कोड निष्पादित हो रहा है। –

+2

मुझे यह नहीं मिला, क्या आप अंततः पढ़ने के लिए कड़ी मेहनत करते हैं? –

+1

कैच ब्लॉक में वापसी करना मुश्किल हो सकता है क्योंकि आप अंततः कथन को बाईपास करने की अपेक्षा करते हैं। कोशिश ब्लॉक में रिटर्न ब्लॉक डालने के बारे में भी कहा जा सकता है। आम तौर पर वापसी का मतलब है "विधि में सभी निष्पादन बंद हो जाता है और नियंत्रण कॉलर को वापस भेजता है" जबकि आखिरकार ब्लॉक हमेशा प्रयास/पकड़ने के दौरान चलता है, तो भविष्यवाणी करना कि प्राथमिकता लेना आसान नहीं है। – Trisped

2

सामान्य रूप से, ऐसा न करें। मुद्दा यह है कि दृष्टि और तकनीकी रूप से पकड़ के तर्क को पकड़ ब्लॉक से बाहर निकलने की आवश्यकता होती है। उदाहरण के लिए, यदि आपके पास अंतिम ब्लॉक है, तो आपको क्या लगता है कि यह कोड आपको देगा?

int Test(out int t) 
    { 
     int i = 1; 
     t = 1; 
     try 
     { 
      if(DateTime.Now.Second < 58) 
       throw new Exception(); 
     } 
     catch (Exception) 
     { 
      return i; 
     } 
     finally 
     { 
      i = 2; 
      t = 2; 
     } 

     return -1; 
    } 

उत्तर: यह 1 वापसी होगी के रूप में यदि हम केवल मार डाला है मैं = 1 लेकिन यह टी = 2 होता है, भले ही टी = 2 हुआ के बाद मैं = 2.

आप दृश्य देख सकते हैं और "वापसी के बाद कोई कोड निष्पादित नहीं होगा" का तकनीकी नियम टूटा हुआ है।

0

आप कैच ब्लॉक में return जोड़ सकते हैं। आप स्पष्ट रूप से जानते हैं कि आपका कोड कैच ब्लॉक पर रुकने के बजाय वापस आ जाएगा और निष्पादन जारी रखेगा।

try{ 
    //do something 
} 
catch{ 
    //error handling 
    return; 
} 
इसके बजाय अपने कोड में कोशिश पकड़ ब्लॉक के एक बहुत है कि भ्रामक प्राप्त कर सकते हैं और सिर्फ अपने कोड में एक मेस का कारण होने की

, यह बेहतर आपके नोए कोशिश पकड़ में सब कुछ संभाल और बस की जाँच क्या त्रुटि दी थी ।

try{ 
    //do something 
} 
catch (Exception as err){ 
    if (err == "IOException"){ 
     //handle exception 
    else if (err.indexOf("TypeError"){ 
     //handle exception 
    } 
} 

यह जांचने के दो तरीके हैं कि अपवाद किस प्रकार था ताकि आप तदनुसार एक संदेश प्रदर्शित कर सकें। यदि आप Exception as err के बजाय चाहते थे तो आप विशिष्ट अपवाद भी प्राप्त कर सकते हैं, आप catch IOException, ...

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