जवाबों:
यह उपयोगी है यदि आप चाहते हैं कि वर्तमान में निष्पादित विधि अभी भी अपवाद को फेंक दें जबकि संसाधनों को उचित रूप से साफ किया जाए। नीचे एक कॉलिंग विधि से अपवाद को संभालने का एक ठोस उदाहरण है।
public void yourOtherMethod() {
try {
yourMethod();
} catch (YourException ex) {
// handle exception
}
}
public void yourMethod() throws YourException {
try {
db.store(mydata);
} finally {
db.cleanup();
}
}
catch
ब्लॉक नहीं है, तो अपवाद finally
को try
ब्लॉक में किसी भी अपवाद से पहले निष्पादित किया जाएगा । इसलिए यदि दो अपवाद हैं, तो एक अपवाद है try
और एक finally
ही अपवाद है कि फेंक दिया जाएगा finally
। यह व्यवहार PHP और Python में समान नहीं है क्योंकि दोनों अपवादों को एक ही समय में इन भाषाओं में फेंक दिया जाएगा और अपवादों का क्रम try
पहले एक है finally
।
यह वहां है क्योंकि प्रोग्रामर यह सुनिश्चित करना चाहता था कि db.cleanup()
जिसे बुलाया गया है, भले ही कोशिश ब्लॉक के अंदर कोड एक अपवाद फेंकता है। किसी भी अपवाद को उस ब्लॉक द्वारा नियंत्रित नहीं किया जाएगा, लेकिन अंत में ब्लॉक निष्पादित होने के बाद उन्हें केवल ऊपर की ओर प्रचारित किया जाएगा।
try
सिर्फ वहाँ अनुमति देने के लिए है finally
। अपवाद नहीं पकड़े गए हैं।
यह कोड इस तरह से क्यों करता है?
क्योंकि स्पष्ट रूप से कोड को नहीं पता कि इस स्तर पर अपवादों को कैसे संभालना है। यह ठीक है - जब तक कि कॉलर्स में से एक करता है, यानी जब तक कि अपवाद अंततः कहीं न कहीं संभाल जाता है।
अक्सर, निम्न-स्तरीय कोड अपवादों के लिए उचित रूप से प्रतिक्रिया नहीं कर सकता क्योंकि उपयोगकर्ता को सूचित करने की आवश्यकता होती है, या अपवाद को लॉग इन करना होगा, या किसी अन्य रणनीति की कोशिश करनी होगी। निम्न-स्तरीय कोड केवल एक कार्य करता है और उच्च-स्तरीय निर्णय लेने के बारे में नहीं जानता है।
लेकिन कोड को अभी भी अपने संसाधनों को साफ करने की आवश्यकता है (क्योंकि अगर ऐसा नहीं होता है, तो वे लीक हो जाएंगे), इसलिए यह केवल finally
खंड में होता है, यह सुनिश्चित करने के साथ कि यह हमेशा होता है, चाहे अपवाद फेंक दिया गया हो या नहीं।
अंत में ब्लॉक यह सुनिश्चित करता है कि यहां तक कि जब एक RuntimeException को फेंक दिया जाता है (शायद तथाकथित कोड में कुछ बग के कारण), db.cleanup()
कॉल किया जाएगा।
यह अक्सर बहुत अधिक घोंसले के शिकार को रोकने के लिए भी उपयोग किया जाता है:
try
{
if (foo) return false;
//bla ...
return true;
}
finally
{
//clean up
}
विशेष रूप से जब कई बिंदु होते हैं जिस पर विधि वापस आती है, तो यह पठनीयता में सुधार करता है क्योंकि कोई भी देख सकता है कि क्लीन अप कोड हर मामले में कहा जाता है।
कोड यह सुनिश्चित करने के लिए कर रहा है कि डेटाबेस बंद है।
आमतौर पर, जिस तरह से आप करते हैं वह आपके सभी डेटाबेस एक्सेस कोड को कोशिश ब्लॉक में डालना है, और फिर अंततः ब्लॉक में डेटाबेस को बंद करने के लिए कॉल करना है।
जिस तरह से कोशिश ... अंत में काम करता है, इसका मतलब है कि कोशिश ब्लॉक में कोड चलाया जाता है, और अंत में ब्लॉक में कोड चलाया जाता है जब वह खत्म होता है ... कोई फर्क नहीं पड़ता।
कम्प्यूटर का छोटा भाग दीवार से सटा हुआ, अंत में निष्पादित होगा।
इसका मतलब यह है कि भले ही एक अपवाद कहा जाता है, और विधि को निष्पादित करने में तीन साल लगते हैं, यह अभी भी अंततः ब्लॉक में जाएगा और डेटाबेस बंद हो जाएगा।
fopen
या DB कनेक्शन (PHP में भी) के लिए उल्लिखित अन्य प्रतिक्रियाओं के रूप में सफाई सुनिश्चित करता है