java क्या यह `प्रयास करें..छोड़..अंततः 'बेमानी है?




exception-handling control-flow (4)

public Foo doDangerousStuff() throws Exception {
    try {
        dangerousMethod();
        return new Foo();
    } catch (Exception e) {
        throw e;
    } finally {
        mustBeCalledAfterDangerousMethod();
    }
}

क्या यह किसी अन्य तरीके से व्यवहार करता है, अगर हम पकड़ने वाले खंड को छोड़ दें?

public Foo doDangerousStuff() throws Exception {
    try {
        dangerousMethod();
        return new Foo();
    } finally {
        mustBeCalledAfterDangerousMethod();
    }
}

भ्रम को दूर करने के लिए [संपादित करें] हाँ, catch ब्लॉक अपवाद फेंकने के अलावा कुछ भी नहीं करता है। मैं सोच रहा था कि finally ब्लॉक कब शुरू किया जाता है (लगता है कि फेंक दिया अपवाद कॉलर द्वारा पकड़ा गया है) में किसी प्रकार के भिन्न क्रम के कारण होता है, लेकिन इस तरह से जवाबों से मैं अनुमान लगाता हूं, ऐसा नहीं है।


आप सही हैं, यह वही है। यहां तक ​​कि स्टैकट्र्रेस भी होंगे :)

लेकिन समान कोड का उपयोग हो सकता है यदि आप किसी अपवाद को कुछ उच्च स्तर पर लपेटते हैं। यदि कोड बिल्कुल जैसा दिखता है तो यह वास्तव में व्यर्थ है


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


वह एक जैसे है। मैं दूसरे संस्करण का उपयोग करेगा।


हाँ। चूंकि आपकी पद्धति पहले से "अपवाद" फेंकता है, इसलिए आपको उसे पकड़ने और इसे फिर से फेंकने की आवश्यकता नहीं है। जब तक आप ऐसा नहीं करना चाहते हैं,





try-catch-finally