2012-08-07 16 views
6

अरे स्टैक ओवरफ्लो समुदाय,अपवाद फेंकने और पकड़ने

अपवाद फेंकने के संबंध में। आम तौर पर, जब मैं फेंक और अपवाद करता हूं, और मैं इसे कब पकड़ूं?

मान लीजिए कि मैं इन परिस्थितियों में आया हूं जहां मुझे कुछ समस्या होने के कारण छोड़ना है और मैं इससे ठीक नहीं हो सकता। क्या मैं फेंकता हूं या करता हूं?

मैं अभी ऐसा:

try { 
     // some code 
    } 
    catch (IOException e) { 
     logger.info("Failed to do something, and cannot continue" + e.getMessage(), e); 
     e.printStackTrace(); 
     throw e; 
    } 

यह करने के लिए सही बात है? अगर मैं अपवाद फेंक दिया तो क्या यह अधिक उपयुक्त होगा? क्षमा करें, मैं अपवादों पर एक नौसिखिया हूं :)

उत्तर

8

जब आप अपने प्रोग्राम को जारी रखना चाहते हैं तो आप आमतौर पर एक विधि में अपवाद प्राप्त करते हैं। जब आप उच्च स्तर की विधि चाहते हैं तो अपवाद को फेंकने के लिए उस विधि को कॉल करने के लिए आप अपवाद फेंक देते हैं। उदाहरण के लिए, आप इसे अपने मुख्य विधि पर वापस ला सकते हैं, जिसमें आपके सभी विधि कॉल को समाहित करने के लिए प्रयास करें .. अलग-अलग अपवादों के लिए अलग-अलग पकड़ ब्लॉक (संभवतः अलग-अलग अपवादों के लिए अलग-अलग पकड़ ब्लॉक के साथ), और अपवादों को वहां संभाला जा सकता है (उदाहरण के लिए कार्यक्रम समाप्त)।

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

सलाह का एक सामान्य शब्द - printStackTrace() खराब है। आप स्वयं को बेहतर त्रुटि आउटपुट बना सकते हैं (और आप अपने आउटपुट के साथ स्टैक ट्रेस भी शामिल कर सकते हैं)। यहां तक ​​कि बेहतर, लॉगिंग का उपयोग करें।

मैं this introduction to exceptions और this article which covers good and bad exception patterns पढ़ने की अनुशंसा करता हूं।

1

यदि कोई घातक अपवाद अपवाद को पकड़ता है और आपके कार्यक्रम को अच्छी तरह समाप्त करता है। पकड़ने के बिना रेथ्रोइंग सिर्फ आपके कार्यक्रम को मार डालेगा।

0

पकड़ने के बाद मैं इस घटना को लॉग कर दूंगा और फिर व्यवस्थित रूप से बंद करने के लिए आपको जो चाहिए और फिर System.exit पर कॉल करें, लेकिन मैं उस अपवाद को फिर से नहीं फेंकूंगा।

0

एक अनचाहे अपवाद के कारण आपका प्रोग्राम समाप्त होने का बुरा अभ्यास है। आप एक अपवाद है कि घातक है पकड़ने और अप्राप्य निम्नलिखित करते हैं:

  1. लॉग इन करें यह
  2. किसी भी necissary सफाई
  3. प्रदर्शन कार्यक्रम
1

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

+0

तो आप कह रहे हैं कि अगर मेरे पास अपवाद है कि मैं उस विधि के अंदर संभाल नहीं सकता, तो मुझे इसे फेंक देना चाहिए। लेकिन, अगर मैं उसी विधि के अंदर से पुनर्प्राप्त कर सकता हूं, तो वह तब होता है जब विधि के अंदर पकड़ना उचित होता है। साथ ही, क्या मुझे अपरिवर्तनीय विधि को लागू करने वाले तरीकों (विधियों, परीक्षणों) के लिए अपवाद को छोड़ना चाहिए? –

+0

हां, आप केवल पकड़ते हैं कि आप कुछ कैसे कर सकते हैं। मैं अंतिम भाग को समझ नहीं पाया, क्या आप इसे फिर से बदल सकते हैं? –

+0

इसके बारे में क्षमा करें, मुझे दोबारा प्रयास करने दो। मैं वास्तव में कहने का मतलब यह था कि जब मैं ऐसी विधि का उपयोग करता हूं जो कुछ यूनिट परीक्षण या मुख्य विधि में अपवाद फेंकता है, और मान लें कि मैं परीक्षण को अपवाद फेंक देता हूं। वहां क्या होता है? क्या यह अभी निकल गया है? क्या यह त्रुटि संदेशों को प्रिंट करता है? इस स्थिति में करने के लिए सबसे उपयुक्त बात क्या है? –

1


एक अपवाद है जब आपके पास इसके साथ कुछ करने के लिए कुछ है। अपने मामले में - लॉग में लिखें, उपयोगकर्ता को एक संदेश प्रदर्शित करें और व्यवस्थित फैशन में छोड़ दें।
आप फेंक देते हैं जब ऐसा होता है तो ऐसा कुछ भी नहीं होता है जब आप ऐसा करते हैं।

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

संबंधित मुद्दे