एक कोशिश में पकड़ में फेंकने और अपवाद का उपयोग करने के बीच अंतर


304

कभी-कभी, मैं देखता हूं

try {

} catch(Throwable e) {

}

और कभी - कभी

try {

} catch(Exception e) {

}

अंतर क्या है?



जवाबों:


247

Throwableइसे पकड़कर उन चीजों को शामिल किया जाता है जो उपवर्ग हैं Error। आपको आम तौर पर ऐसा नहीं करना चाहिए, सिवाय एक धागे के बहुत उच्चतम "पकड़" स्तर पर जहां आप लॉग इन करना चाहते हैं या अन्यथा पूरी तरह से सब कुछ संभाल सकते हैं जो गलत हो सकता है। यह एक फ्रेमवर्क एप्लिकेशन में अधिक विशिष्ट होगा (उदाहरण के लिए एक एप्लिकेशन सर्वर या एक टेस्टिंग फ्रेमवर्क) जहां यह अज्ञात कोड चल सकता है और उस कोड से गलत होने वाली किसी भी चीज से प्रभावित नहीं होना चाहिए , जितना संभव हो।


30
शायद यहाँ पदानुक्रम का थोड़ा सा वर्णन करना सबसे अच्छा होगा।
Xonatron

11
इस उत्तर के लिए संदर्भ: थ्रोबेबल में उप-वर्ग के रूप में त्रुटि और अपवाद दोनों शामिल हैं, इसलिए पहली कोशिश / पकड़ दूसरे में शामिल है, लेकिन आमतौर पर अधिक-व्यापक है।
नोएल

2
इसमें थ्रोबल के उपयोगकर्ता-परिभाषित प्रत्यक्ष उप-वर्ग और थ्रोएबल के उदाहरण भी शामिल हैं। आपको लिखने से कुछ भी नहीं रोक रहा है throw new Throwable();, इसलिए यह सबकुछ को पकड़ने का एकमात्र तरीका है।
एंटीमनी

3
यद्यपि स्वीकार किया जाता है, यह सवाल का जवाब नहीं दे रहा है क्योंकि अधिकांश उत्तर अपवाद और थ्रोबेबल दोनों को पकड़ने के लिए एक सर्वोत्तम अभ्यास का वर्णन करते हैं, और यह सवाल अंतर के बारे में था (जैसे कि कब क्या उपयोग करना चाहिए)। "इसमें ऐसी चीजें शामिल हैं जो उपवर्ग त्रुटि" निर्दिष्ट एकमात्र अंतर है और यह वास्तव में एक व्यापक जवाब है: त्रुटि क्या है? यह क्यों मायने रखता है कि इसमें यह शामिल है? किसी भी अन्य मतभेद या सर्वोत्तम प्रथाओं?
ओड निव

@OdedNiv "त्रुटि क्या है? यह क्यों मायने रखता है कि इसमें यह शामिल है?" आप उन लोगों से एक और सवाल पूछ सकते हैं।
Kronen

182

पहले वाला सभी उपवर्गों Throwable(इसमें शामिल है Exceptionऔर Error) को पकड़ता है, दूसरा वाला सभी उपवर्गों को पकड़ता है Exception

Errorप्रोग्रामेटिक रूप से किसी भी तरह से अपरिवर्तनीय है और आमतौर पर लॉगिंग उद्देश्यों (जो इसे फिर से गुजरता है) को छोड़कर पकड़ा नहीं जा सकता है। Exceptionप्रोग्राम रिकवर करने योग्य है। इसका उपवर्ग RuntimeExceptionएक प्रोग्रामिंग त्रुटि को इंगित करता है और आमतौर पर पकड़ा नहीं जा सकता है।


37
आश्चर्यजनक रूप से, इस उत्तर के 4 साल बाद, सबसे "कोड विश्लेषण" उपकरण अभी भी एक महत्वपूर्ण त्रुटि के रूप में फेंकने योग्य होने की रिपोर्ट करेगा । थ्रोबेबल को पकड़ने के लिए लॉगिंग एक बहुत ही मान्य कारण है। विकासशील सर्वरों के वर्ष मुझे बताते हैं कि 1) लॉगिंग ए Errorऔर 2 प्राप्त करने के बावजूद होगी ) जब तक लॉगिंग नहीं होती है, तो आपको कभी भी यह सूचना नहीं मिल सकती है कि एक ओओएम हुआ है, आपको आश्चर्य होता है कि सर्वर ने "अजीब" व्यवहार क्यों करना शुरू कर दिया
ब्रूनो ग्रिएडर

4
programmatically unrecoverableवास्तव में क्या मतलब है? क्या यह इतना गंभीर है, कि हम मूल रूप से JVM से अप्रत्याशित व्यवहार प्राप्त करने का मौका दिए बिना इसे (लॉगिंग, आदि) को पकड़ने के बाद मूल रूप से किसी जावा विधि को कॉल नहीं कर सकते हैं?
अलेक्जेंडर अबाकुमोव

Its subclass RuntimeException indicates a programming error: निश्चित नहीं अगर मैं इस कथन से सहमत हूं। यदि यह सच है, तो इसका मतलब है कि सभी अपेक्षित अपवादों को अपवादों की जाँच करनी चाहिए। क्या होगा अगर मुझे उम्मीद है कि कुछ विफल हो सकता है और मेरे आवेदन से अप्राप्य है, लेकिन मैं कम से कम एक सार्थक अपवाद फेंकना चाहता हूं? उस स्थिति में चेक किए गए अपवाद का उपयोग करना बेकार लगता है और बॉयलरप्लेट कोड बनाता है।
नोम

22

Thowableवास्तव में सब कुछ भी पकड़ता है यहां तक ​​कि थ्रेडडॉट जो डिफ़ॉल्ट रूप से फेंका जाता है अब थ्रेडेड Thread.stop()विधि से एक थ्रेड को रोकने के लिए । इसलिए पकड़ने से Throwableआप यह सुनिश्चित कर सकते हैं कि आप कम से कम अपने कैच ब्लॉक से गुजरे बिना कभी भी कोशिश करने वाले ब्लॉक को नहीं छोड़ेंगे, लेकिन आपको भी संभालना चाहिए OutOfMemoryErrorऔर InternalErrorया फिर तैयार रहना चाहिए StackOverflowError

Throwableबाहरी सर्वर लूप के लिए कैचिंग सबसे उपयोगी है जो बाहरी कोड के लिए सभी प्रकार के अनुरोधों को सौंपता है, लेकिन सेवा को जीवित रखने के लिए कभी भी समाप्त नहीं कर सकता है।


21

Throwableके Exceptionरूप में अच्छी तरह से सुपर वर्ग है Error। सामान्य मामलों में हमें हमेशा उप-वर्गों को पकड़ना चाहिए Exception, ताकि मूल कारण खो न जाए।

केवल विशेष मामले जहां आप चीजों को गलत होने की संभावना देखते हैं जो आपके जावा कोड के नियंत्रण में नहीं है, आपको पकड़ना चाहिए Errorया Throwable

मुझे याद है कि थ्रोबल को झंडे को पकड़ना कि एक देशी पुस्तकालय लोड नहीं है।


0

मैंने देखा है कि लोग थ्रोबेबल का उपयोग कुछ त्रुटियों को पकड़ने के लिए करते हैं जो कि इन्फ्रा विफलता / गैर उपलब्धता के कारण हो सकती हैं।

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