2011-09-27 9 views
9

मेरे बाद इसके बाद कई अलग-अलग कैच के साथ प्रयास किया गया है। मेरे पास कुछ "क्लीनअप" कोड है जो एक अपवाद फेंक दिया गया था केवल तभी चलाया जाना चाहिए। मैं प्रत्येक अपवाद में एक ही कोड जोड़ सकता हूं, लेकिन यह एक रखरखाव दुःस्वप्न बन जाता है। असल में, मुझे अंत में बयान की तरह कुछ चाहिए, लेकिन इसके लिए केवल एक अपवाद फेंक दिया गया था।केवल अपवाद फेंकने पर कोड चलाने के लिए कैसे?

क्या यह संभव है?

+0

क्या ये रनटाइम त्रुटियां हैं जिन्हें आप पकड़ रहे हैं या अपनी खुद की व्यवसाय त्रुटियां हैं। – Shahzeb

+0

आईओएक्सप्शन, क्लाइंटप्रोटोकॉल अपवाद, असमर्थित एन्कोडिंग अपवाद, आदि – Bromide

उत्तर

18

दुर्भाग्य से इस के लिए कोई प्रत्यक्ष समर्थन नहीं है। यह कैसे

boolean successful = false; 
try { 
    // do stuff 
    successful = true; 
} catch (...) { 
    ... 
} finally { 
    if (!successful) { 
     // cleanup 
    } 
} 
1

की तरह कुछ के बारे में केवल एक चीज मैं के बारे में सोच सकते हैं कि प्रत्येक पकड़ में एक चर सेट करने के लिए और फिर अंत में में है कि चर के लिए जाँच है।

स्यूडोकोड:

Boolean caught = false; 

try { 

    //risky code here 

catch(err) { 
    caught = true; 
    // Do other stuff 
} 
catch(err) { 
    caught = true; 
    // Do other stuff 
} 
catch(err) { 
    caught = true; 
    // Do other stuff 
} 
finally { 
    if (caught) { 
     // Do clean up 
    } 

} 
0

आप क्यों नहीं बस सरल कोशिश & पकड़ का उपयोग नहीं करते?

try 
{ 
    foo(); 
} 
catch(Exception1 e1) 
{ 
    dealWithError(1); 
} 
catch(Exception2 e2) 
{ 
    dealWithError(2); 
} 
catch(Exception3 e3) 
{ 
    dealWithError(3); 
} 

... 

private void dealWithError(int i) 
{ 
    if(i == 1) // deal with Exception1 
    else if(i == 2) // deal with Exception2 
    else if(i == 3) // deal with Exception3 
} 
+2

बिल्कुल कोई भी शरीर कभी नहीं करना चाहिए। 'If' सड़क पर दुःस्वप्न। – Shahzeb

1

मैं हर अपवाद के लिए एक ही कोड जोड़ सकते हैं, लेकिन यह एक बुरा सपना रखरखाव हो जाता है।

या आप 'अपवाद' कभी याद नहीं करता है, तो:

मैं करने के लिए प्रत्येक [जगह] एक ही कोड जोड़ सकते हैं, लेकिन यह एक बुरा सपना रखरखाव हो जाता है।

यह किस तरीके के लिए किए गए हैं।

private void cleanup() { /* clean up */ } 

... 

try { 
    // oh noes 

} catch (MyException me) { 
    cleanup(); 
} catch (AnotherException ae) { 
    cleanup(); 
} 

रखरखाव परेशानी चली गई!

+2

इसके अलावा अब आपके पास कॉलर के अंदर मौजूद सामान तक पहुंच नहीं है। अगर सफाई की जरूरत है, तो आप को रोक दिया गया है। और यदि आप गड़बड़ की गई सामग्री को पास करते हैं, तो आप ठीक करने के लिए सामान की सूची को हार्ड-कोडिंग कर रहे हैं - और यदि वह सूची बाद में बदलती है, तो आपको इसका उपयोग करने वाले हर स्थान को बदलना होगा। और आप एक याद करेंगे। – cHao

+0

ओह, और यह 'क्लीनअप' फ़ंक्शन * निश्चित रूप से * निजी 'होना चाहिए, यदि आप इसे रखने का आग्रह करते हैं। – cHao

+0

@cHao जबकि ट्यूर और आखिरकार निश्चित रूप से अच्छा है, अगर आपको एक जगह याद आती है तो कोड संकलित नहीं होगा, इसलिए यह अभी भी कम खराब है – Voo

0

आप अपवाद संचालकों की दो परतों लपेटकर की कोशिश कर सकते हैं, और अपवाद rethrow के बाद आप आम हैंडलिंग किया है:

try { 
     try { 
      // your code goes here 

     } catch (Throwable t) { 
      // do common exception handling for any exception 
      throw t; 
     }  

    } catch (NullPointerException nx) { 
     // handle NPE 
    } catch (Throwable t) { 
     // handle any other exception 
    } 

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

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