क्या यह "पकड़ने" के बिना "कोशिश अंत" करने के लिए समझ में आता है?


127

मैंने कुछ कोड इस तरह देखे:

    try
    {
        db.store(mydata);
    }
    finally
    {
        db.cleanup();
    }

मैंने सोचा कि क्या tryएक माना जाता है catch?

यह कोड इस तरह से क्यों करता है?


1
यह विशेष रूप से फ़ाइल हैंडल fopenया DB कनेक्शन (PHP में भी) के लिए उल्लिखित अन्य प्रतिक्रियाओं के रूप में सफाई सुनिश्चित करता है
MediaVince

जवाबों:


182

यह उपयोगी है यदि आप चाहते हैं कि वर्तमान में निष्पादित विधि अभी भी अपवाद को फेंक दें जबकि संसाधनों को उचित रूप से साफ किया जाए। नीचे एक कॉलिंग विधि से अपवाद को संभालने का एक ठोस उदाहरण है।

public void yourOtherMethod() {
    try {
        yourMethod();
    } catch (YourException ex) {
        // handle exception
    }
}    

public void yourMethod() throws YourException {
    try {
        db.store(mydata);
    } finally {
        db.cleanup();
    }
}

17
आमतौर पर ताले के साथ प्रयोग किया जाता है: lock.lock (); try {/ * बंद कर दिया * /} अंत में {lock.unlock ()}
मिनट

यदि कोई अपवाद अंततः अंदर फेंक दिया जाता है तो क्या होता है?
बर्थ

1
@barth जब कोई catchब्लॉक नहीं है, तो अपवाद finallyको tryब्लॉक में किसी भी अपवाद से पहले निष्पादित किया जाएगा । इसलिए यदि दो अपवाद हैं, तो एक अपवाद है tryऔर एक finallyही अपवाद है कि फेंक दिया जाएगा finally। यह व्यवहार PHP और Python में समान नहीं है क्योंकि दोनों अपवादों को एक ही समय में इन भाषाओं में फेंक दिया जाएगा और अपवादों का क्रम tryपहले एक है finally
बारिश

72

यह वहां है क्योंकि प्रोग्रामर यह सुनिश्चित करना चाहता था कि db.cleanup()जिसे बुलाया गया है, भले ही कोशिश ब्लॉक के अंदर कोड एक अपवाद फेंकता है। किसी भी अपवाद को उस ब्लॉक द्वारा नियंत्रित नहीं किया जाएगा, लेकिन अंत में ब्लॉक निष्पादित होने के बाद उन्हें केवल ऊपर की ओर प्रचारित किया जाएगा।


23
+1 बिल्कुल। tryसिर्फ वहाँ अनुमति देने के लिए है finally। अपवाद नहीं पकड़े गए हैं।
जॉकमैन

2
+1 स्पष्ट करने के लिए कि अपवाद तब तक जारी रहता है जब तक कि वह पकड़ा न जाए। साभार
कोड जॉकी

20

यह कोड इस तरह से क्यों करता है?

क्योंकि स्पष्ट रूप से कोड को नहीं पता कि इस स्तर पर अपवादों को कैसे संभालना है। यह ठीक है - जब तक कि कॉलर्स में से एक करता है, यानी जब तक कि अपवाद अंततः कहीं न कहीं संभाल जाता है।

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

लेकिन कोड को अभी भी अपने संसाधनों को साफ करने की आवश्यकता है (क्योंकि अगर ऐसा नहीं होता है, तो वे लीक हो जाएंगे), इसलिए यह केवल finallyखंड में होता है, यह सुनिश्चित करने के साथ कि यह हमेशा होता है, चाहे अपवाद फेंक दिया गया हो या नहीं।


2

अंत में ब्लॉक यह सुनिश्चित करता है कि यहां तक ​​कि जब एक RuntimeException को फेंक दिया जाता है (शायद तथाकथित कोड में कुछ बग के कारण), db.cleanup()कॉल किया जाएगा।

यह अक्सर बहुत अधिक घोंसले के शिकार को रोकने के लिए भी उपयोग किया जाता है:

try
{
    if (foo) return false;
    //bla ...
    return true;
}
finally
{
    //clean up
}

विशेष रूप से जब कई बिंदु होते हैं जिस पर विधि वापस आती है, तो यह पठनीयता में सुधार करता है क्योंकि कोई भी देख सकता है कि क्लीन अप कोड हर मामले में कहा जाता है।


0

कोड यह सुनिश्चित करने के लिए कर रहा है कि डेटाबेस बंद है।
आमतौर पर, जिस तरह से आप करते हैं वह आपके सभी डेटाबेस एक्सेस कोड को कोशिश ब्लॉक में डालना है, और फिर अंततः ब्लॉक में डेटाबेस को बंद करने के लिए कॉल करना है।
जिस तरह से कोशिश ... अंत में काम करता है, इसका मतलब है कि कोशिश ब्लॉक में कोड चलाया जाता है, और अंत में ब्लॉक में कोड चलाया जाता है जब वह खत्म होता है ... कोई फर्क नहीं पड़ता।
कम्‍प्‍यूटर का छोटा भाग दीवार से सटा हुआ, अंत में निष्पादित होगा।
इसका मतलब यह है कि भले ही एक अपवाद कहा जाता है, और विधि को निष्पादित करने में तीन साल लगते हैं, यह अभी भी अंततः ब्लॉक में जाएगा और डेटाबेस बंद हो जाएगा।


0

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

अंततः ब्लॉक को हमेशा निष्पादित किया जाता है, चाहे कोई अपवाद फेंका जाए या नहीं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.