हम अंत में ब्लॉक का उपयोग क्यों करते हैं?


91

जहाँ तक मैं बता सकता हूँ, दोनों निम्नलिखित स्निपेट एक ही उद्देश्य से काम करेंगे। finallyब्लॉक क्यों हैं ?

कोड A:

try { /* Some code */ }
catch { /* Exception handling code */ }
finally { /* Cleanup code */ }

कोड B:

try { /* Some code */ }
catch { /* Exception handling code */ }
// Cleanup code

यह C # के लिए विशिष्ट नहीं है। यह एक .Net प्रश्न है
Sruly

1
कोई और अधिक java7 साथ की जरूरत: AutomaticResourceManagement, कोशिश (नई resourceDeclartion ()) {}
Kanagavelu Sugumar

जवाबों:


139
  • यदि आप एक अपवाद को नहीं संभालते हैं तो क्या होता है? (मुझे आशा है कि आप नहीं पकड़ रहे हैं Throwable...)
  • यदि आप ट्राई ब्लॉक के अंदर से लौटते हैं तो क्या होता है?
  • क्या होता है अगर कैच ब्लॉक एक अपवाद फेंकता है?

एक finallyब्लॉक यह सुनिश्चित करता है कि हालांकि आप उस ब्लॉक से बाहर निकल जाते हैं (स्पष्ट रूप से पूरी प्रक्रिया को निरस्त करने के कुछ तरीके), यह निष्पादित हो जाएगा। संसाधनों की निर्धारक सफाई के लिए यह महत्वपूर्ण है।


48
जरूरी नहीं कि सच हो; अंत में निष्पादित नहीं होगा अगर (1) एक System.exit()कॉल है (2) वहाँ एक अनंत लूप है कोशिश में या कैच ब्लॉक में से एक (3) मैं कंप्यूटर पर प्लग खींचता हूं
NullUserException

2
@Alon कोशिश {वापसी 1; } अंत में {अनुत्तर 2; } आपको 2
डेनिस सी

19
@NullUserException: इसलिए "कुछ तरीके ..." बिट
जॉन स्कीट

2
जॉन स्कीट
स्टैकओवरफ्लो

1
इस पोस्ट में उन दुर्लभ (दुर्लभ) स्थितियों पर चर्चा की गई है जिनके तहत आखिरकार WON'T को नहीं बुलाया जाएगा।
कैंडमीर जूल

13

ध्यान दें कि (जावा में कम से कम, शायद C # में भी) यह एक tryबिना ब्लॉक के भी संभव है catch, लेकिन एक के साथ finally। जब कोई अपवाद tryब्लॉक में होता है , finallyतो अपवाद को अधिक ऊपर फेंकने से पहले ब्लॉक में कोड चलाया जाता है:

InputStream in = new FileInputStream("somefile.xyz");
try {
    somethingThatMightThrowAnException();
}
finally {
    // cleanup here
    in.close();
}

7

आप उस कोड को डालना चाह सकते हैं जिसे आप किसी भी तरह से लागू करना चाहते हैं, चाहे आपके प्रयास में कोई भी हो या ब्लॉक को पकड़ सकता है।

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

उदाहरण के लिए:

conn c1 = new connection();
try {
    c1.dosomething();
} catch (ExceptionA exa) {
    handleexA();
    //c1.close();
} catch (ExceptionB exb) {
    handleexB();
    //c1.close();
} finally {
    c1.close();
}

1
क्या होगा अगर मैं 'अंत' का उपयोग नहीं करता हूं, लेकिन कनेक्शन बंद कर देता हूं?
इस्तियाक अहमद

5

अंत में हमेशा निष्पादित हो जाता है, जहां पकड़ के बाद आपका कोड नहीं हो सकता है।


1
क्यों नहीं! यदि अपवाद को ठीक से संभाला जाता है तो कोड निश्चित रूप से निष्पादित हो जाएगा।
मोहम्मद नदीम

1
@ नदीम: ऐसा नहीं होने के 3 कारणों के लिए मेरा जवाब देखें।
जॉन स्केट

2

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

आपका एप्लिकेशन थ्रेड्स का एक संग्रह हो सकता है, थ्रेड को Exceptionसमाप्त करता है , लेकिन पूरे एप्लिकेशन को नहीं, इस मामले finallyमें अधिक उपयोगी है।

कुछ मामलों finallyमें जेवीएम फेल, थ्रेड टर्मिनेट आदि जैसे कार्य निष्पादित नहीं होंगे।


1

क्योंकि आपको उस कोड को निष्पादित करने की आवश्यकता है, भले ही किसी भी अपवाद को फेंक दिया जाए। उदाहरण के लिए, आपको कुछ अनवांटेड संसाधन ('कोशिश करने के लिए' संकलन का उपयोग करके / अंत में ब्लॉक) को साफ करने की आवश्यकता हो सकती है।


0

कई बार ऐसा भी हो सकता है कि आप कोड के एक टुकड़े पर अमल करना चाहते हैं, चाहे जो भी हो। कोई अपवाद फेंका जाए या नहीं। फिर एक उपयोग करता है finally


0

finallyजब तक जेवीएम बंद नहीं हो जाता, तब तक एलीवेस निष्पादित होता है, finallyबस एक जगह पर सफाई कोड डालने की विधि प्रदान करता है।

यदि आप प्रत्येक catchब्लॉक में क्लीन अप कोड डालना चाहते हैं तो यह बहुत थकाऊ होगा ।


0

यदि पकड़ ब्लॉक किसी भी अपवाद को फेंकता है तो शेष कोड निष्पादित नहीं किया जाएगा इसलिए हमें अंतिम ब्लॉक लिखना होगा।


0

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


यदि प्रोग्राम से बाहर निकलता है (या तो System.exit () कॉल करके या एक घातक त्रुटि के कारण जो प्रक्रिया को समाप्त करने का कारण बनता है) अंत में ब्लॉक को निष्पादित नहीं किया जाएगा।


0

अभी भी नीचे स्क्रॉल कर रहे हैं? हेयर यू गो!

इस सवाल ने मुझे कुछ समय पहले कठिन समय दिया।

try
{
 int a=1;
 int b=0;
 int c=a/b;
}
catch(Exception ex)
{
 console.writeline(ex.Message);
}
finally
{
 console.writeline("Finally block");
}
console.writeline("After finally");

उपरोक्त परिदृश्य में क्या छपा होगा? हाँ सही अनुमान लगाया:

  • ex.Message - यह जो कुछ भी है (शायद शून्य से विभाजन का प्रयास किया गया है)

  • अंत में ब्लॉक करें

  • आखिरकार

    try
    {
        int a=1;
        int b=0;
        int c=a/b;
    }
    catch(Exception ex)
    {
        throw(ex);
    }
    finally
    {
        console.writeline("Finally block");
    }
    console.writeline("After finally");
    

यह क्या छपेगा? कुछ भी तो नहीं! यह एक त्रुटि फेंकता है क्योंकि पकड़ ब्लॉक ने एक त्रुटि उठाई।

एक अच्छी प्रोग्रामिंग संरचना में, आपके अपवादों को अंतिम रूप दिया जाएगा, इस अर्थ में कि यह कोड दूसरी परत से संभाला जाएगा। इस तरह के एक मामले को उत्तेजित करने के लिए मैं नेस्टेड हूँ इस कोड की कोशिश करो।

try
{    
 try
    {
     int a=1;
     int b=0;
     int c=a/b;
    }
    catch(Exception ex)
    {
     throw(ex);
    }
    finally
    {
     console.writeline("Finally block")
    }
    console.writeline("After finally");
}
catch(Exception ex)
{
 console.writeline(ex.Message);
}

इस मामले में आउटपुट होगा:

  • अंत में ब्लॉक करें
  • ex.Message - जो भी है।

यह स्पष्ट है कि जब आप एक अपवाद को पकड़ते हैं और इसे फिर से अन्य परतों (फ़नलिंग) में फेंक देते हैं, तो फेंकने के बाद का कोड निष्पादित नहीं होता है। यह ठीक उसी तरह काम करता है जैसे किसी फंक्शन के अंदर वापसी कैसे काम करती है।

अब आप जानते हैं कि कैच ब्लॉक के बाद कोड पर अपने संसाधनों को बंद क्यों नहीं करना चाहिए। उन्हें अंत में ब्लॉक करें।

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