2012-05-03 24 views
18

मुझे आश्चर्य है, क्या कोई अपवाद फेंकने पर केवल ब्लॉक निष्पादित करने का कोई तरीका है?अंततः पकड़ने का प्रयास करें: अगर कोई अपवाद फेंक दिया गया है तो कुछ करें

bool exception = false; 
try{ 
    // something 
}catch(Exception e){ 
    exception = true; 
}finally{ 
    if(!exception){ 
     // i can do what i want here 
    } 
} 

वहाँ एक बेहतर तरीका है:

सबसे अच्छा मैं के साथ आ सकते हैं

है?

+0

क्या आपके पास अपने प्रयास ब्लॉक में कोई "वापसी" है? – Guillaume

+0

उत्तरों के बीच उनके 18 प्रश्न और प्रश्न 1 वोट हैं? –

+0

@ गुइलाउम कोई रिटर्न – lowerkey

उत्तर

33

निश्चित रूप से यह है: इसे try ब्लॉक के नीचे रखें।

try{ 
    // something 
    // i can do what i want here 
}catch(Exception e){ 
    // handle exception 
} 

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

आप पुराने व्यवहार वापस लाना चाहते हैं, तो आप भी इस प्रकार है कि बस "अगर कोई अपवाद नहीं है" शर्त लेखन की खातिर एक finally की आवश्यकता नहीं है का उपयोग कर सकते हैं:

var checkpointReached = false; 
try{ 
    // something 
    checkpointReached = true; 
    // i can do what i want here 
}catch(Exception e){ 
    if (checkpointReached) throw; // don't handle exceptions after the checkpoint 
    // handle exception 
} 
+0

+1, अच्छा जवाब। –

+0

समस्या के साथ यदि आप इस पैटर्न को दोहराते हैं तो आपको कोशिश-पकड़ने का प्रयास मिलता है। तो यह केवल तभी अनुशंसा की जाती है जब आपके पास कुछ अपवाद अपेक्षित हों। –

+0

@dystroy: सुनिश्चित नहीं है कि आपका क्या मतलब है, क्या आप विस्तृत कर सकते हैं? – Jon

3

आपके पास अंत में खंड की आवश्यकता नहीं है।

एक समाधान:

bool exception = false; 
try{ 
    // something 
}catch(Exception e){ 
    exception = true; 
} 
if(!exception){ 
    // u can do what u want here 
} 

आमतौर पर आप बस अपनी पकड़ खंड में एक वापसी करनी होगी, ताकि आप भी परीक्षण की जरूरत नहीं है:

try{ 
    // something 
}catch(Exception e){ 
    // do things 
    return; 
} 
// u can do what u want here 

या (उपयोग के आधार पर मामला और आम तौर पर कम स्पष्ट, विशेष रूप से यदि आपके पास एक से अधिक अपवाद अपेक्षित हैं - आप कोशिश करने की कोशिश नहीं करना चाहते हैं ...):

try{ 
    // something 
    // u can do what u want here 
}catch(Exception e){ 
    // do things 
} 
1

नहीं - आपको जो मिला है वह शायद सी # में ऐसा करने का सबसे अच्छा तरीका है।

यह मानते हुए किया जाता है कि:

  • आप "मुझे लगता है मैं यहाँ क्या चाहते हैं कर सकते हैं" कोड अपने try ब्लॉक के तल पर चलाने के लिए नहीं करना चाहती। (शायद क्योंकि आप नहीं है कि कोड में अपवाद मुख्य catch ब्लॉक द्वारा नियंत्रित किया जा करना चाहते हैं।)
  • आप पूरी तरह try...catch...finally के बाहर चलाने के लिए "मुझे लगता है मैं यहाँ क्या चाहते हैं कर सकते हैं" कोड नहीं करना चाहती संरचना। (शायद क्योंकि आप चाहते हैं कुछ अन्य कोड है कि finally ब्लॉक के अंदर बैठी है से पहले चलाने के लिए कि कोड।)
4

आप अपने कोड की संरचना कर सकते हैं कि doSomething ब्लॉक में पिछले बयान है और यह फेंक नहीं है?

bool exception = false; 
try{ 
    // something 
    doSomething(); 
} catch { 
} 
finally { 
} 
+0

@ जेफ फोस्टर्नो को आखिरकार यहां अवरुद्ध करने की आवश्यकता है। –

+1

मुझे लगता है कि कुछ बॉयलरप्लेट क्लीनअप कोड था जो हमेशा चलाना चाहता था। यदि नहीं, तो आप निश्चित रूप से सही हैं, यह अनावश्यक है। –

2

हाँ है: कोशिश ब्लॉक :)

1

के अंत में डाल दिया जबकि वहाँ अपने कोड के साथ कुछ भी गलत नहीं है, यह अनावश्यक है।

try { 
    ... 
    // No errors to this point, run what you wanted to run in the finally. 
} 
catch(Exception e) { 
    ... 
} 
0

मेरा मानना ​​है कि आप अपनी कोशिश के अंदर एक कोशिश के लिए देख रहे हैं:: बस कोशिश ब्लॉक के तल पर कोड आप पर अमल करना चाहते हैं डाल

try{ 
    // something 

    try{ 
     // something else not interfering with first try 
    } catch(Exception innerEx){ 
     // something else threw this innerEx 
    } 

}catch(Exception outerEx){ 
    // something threw this outerEx 
} 

इस हालांकि आम तौर पर खराब व्यवहार का माना जाता है, मुझे इसे ध्वज संस्करण से अधिक पसंद है।

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