2011-05-23 29 views
17
try{ 
    }catch(){} 
    finally{ 
    try{ 
     }catch(){ } 
    fianlly{ } 
    } 

क्या यह उपरोक्त कोड होना अच्छा है?अंततः ब्लॉक को पकड़ने के लिए अंत में ब्लॉक करें

+0

को जारी रखना और बंद करना चाहते हैं शायद इसे पढ़ें: http://stackoverflow.com/questions/1335812/try-catch-finally-and-then अच्छा उदाहरण – planetjones

उत्तर

23

हां, आप यह कर सकते हैं।

InputStream in = /* ... */; 
try { 
} catch (...) { 
} finally { 
    try { 
     in.close(); 
    } catch (...) { 
    } finally { 
    } 
} 

मैं किसी भी मामले में जो इसके लिए एक बुरा व्यवहार

+0

+1। लेकिन मैं हमेशा इसे शायद ही पठनीय कोड के रूप में मानता हूं और कुछ उपयोग विधि या कक्षा बनाने की कोशिश करता हूं जो शून्य जांच के साथ बंद करने योग्य उदाहरण बंद कर सकता है। – Alp

+0

अच्छा उदाहरण के लिए -गैन-ए-ट्राई-कैच –

1

बदसूरत लग रहा है लेकिन कभी-कभी यह जाने का तरीका है। कोड के आधार पर दूसरी कोशिश-पकड़-अंत में ब्लॉक के साथ एक विधि निकालने पर विचार करें।

1

जब आप कर सकते हैं, तो इससे बचने के लिए सबसे अच्छा है, लेकिन कभी-कभी यह आवश्यक हो सकता है। यदि आप हमें इस बारे में अधिक बताते हैं कि आपको इसकी आवश्यकता क्यों है, तो हम बेहतर उत्तर देने में सक्षम हो सकते हैं :-)

finally ब्लॉक में लेनदेन करने के लिए एक कारण हो सकता है, जब प्रतिबद्ध संचालन स्वयं हो सकता है एक अपवाद फेंक दो।

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

7

होगा नहीं दिख रहा है:

असल में, आप भी यह करने के लिए जब धाराओं आप ठीक ढंग से बंद करना चाहते हैं के साथ काम कर के लिए आवश्यक हैं पठनीयता तो आपको एक अलग विधि करने के लिए नेस्टेड कोशिश पकड़ बाहर कारक बन सकते हैं, जैसे:

try{ 
    }catch(){} 
    finally{ 
    cleanup(); 
    } 

और दूसरा कोशिश पकड़ सफाई विधि के अंदर हो सकता है।

आईओ पैकेज में ऊपर पैटर्न का समर्थन करने के लिए, Java6 closeable नामक एक नया वर्ग का परिचय है कि सभी धाराओं को लागू है, ताकि आप एक ही सफाई विधि इस प्रकार हो सकते हैं:

public static boolean cleanup(Closeable stream) 
{ 
try{ 
    stream.close(); 
    return true; 
    }catch(){ 
    return false; 
    } 
} 
1

यह बदसूरत है, लेकिन देखते हैं ऐसे मामले जहां आप इससे बच नहीं सकते हैं, खासतौर से संसाधन में जहां आपके पास निर्भर संसाधन हैं और एक संसाधन की सफाई अपवाद को फेंक सकती है।

एक सामान्य उदाहरण जेडीबीसी कोड में परिणामसेट, स्टेटमेंट और कनेक्शन ऑब्जेक्ट्स को व्यवस्थित कर रहा है। परिणामसेट बंद करने से अपवाद फेंक सकता है, लेकिन हम अभी भी स्टेटमेंट और कनेक्शन

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