2011-03-29 10 views
9

मैं जावा में नया हूं और सामान्य रूप से अपवाद करता हूं।मैं जावा अपवाद में कैसे संलग्न करूं?

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

मुझे अक्सर पता चलता है कि जब मैं अपवाद पकड़ता हूं, तो मैं अपने दो सेंट जोड़ना चाहता हूं, फिर इसे पास कर दूंगा।

यह कैसे किया जा सकता है? मैं पूरे स्टैक ट्रेस को फेंकना नहीं चाहता ... मुझे नहीं पता कि विफलता कितनी गहरी हुई और किस कारण से।

मेरे पास एक स्ट्रैक ट्रैक (एक अपवाद वस्तु से) को स्ट्रिंग में बदलने के लिए एक छोटी उपयोगिता लाइब्रेरी है। मुझे लगता है कि मैं इसे अपने नए अपवाद संदेश में जोड़ सकता हूं, लेकिन यह एक हैक जैसा लगता है।

नीचे एक उदाहरण विधि है। सलाह?


    public void foo(String[] input_array) { 
     for (int i = 0; i < input_array.length; ++i) { 
      String input = input_array[i]; 
      try { 
       bar(input); 
      } 
      catch (Exception e) { 
       throw new Exception("Failed to process input [" 
         + ((null == input) ? "null" : input) 
         + "] at index " + i + ": " + Arrays.toString(input_array) 
         + "\n" + e); 
      } 
     } 
    } 
+0

पीटर में दिखाया जाएगा: टिप के लिए धन्यवाद। वह में स्वयं कर लूँगा। – kevinarpe

उत्तर

26

अपवाद श्रृंखलित जा सकता है:

try { 
    ... 
} catch (Exception ex) { 
    throw new Exception("Something bad happened", ex); 
} 

यह मूल अपवाद कारण नया एक की बनाता है। अपवाद का कारण getCause() का उपयोग कर प्राप्त किया जा सकता है, और नए अपवाद पर printStackTrace() बुला प्रिंट होगा:

 
Something bad happened 
... its stacktrace ... 
Caused by: 
... original exception, its stacktrace and causes ... 
+1

क्या इस मामले अपवाद में एक और सामान्य अपवाद के साथ IOException जैसे एक्सटेंशन को लपेटना सबसे अच्छा अभ्यास है? – metdos

4

आमतौर पर आप कोई नया अपवाद है जो एक "कारण" के रूप में वर्ष अपवाद भी शामिल फेंक देते हैं। अधिकांश अपवाद वर्गों में एक कन्स्ट्रक्टर होता है जो "कारण" अपवाद स्वीकार करता है। (आप इसे Throwable.getCause() के माध्यम से प्राप्त कर सकते हैं।)

ध्यान दें कि आपको लगभग Exception को पकड़ना नहीं चाहिए - आम तौर पर आपको अधिक विशिष्ट प्रकार के अपवाद को पकड़ना चाहिए।

0

आप एक नव निर्मित अपवाद के लिए अंतर्निहित कारण जोड़ सकते हैं:

throw new Exception("Failed to process input [" 
       + ((null == input) ? "null" : input) 
       + "] at index " + i + ": " + Arrays.toString(input_array) 
       + "\n" + e.getMessage(), e); 
1

बस एक अलग निर्माता का उपयोग करें:

Exception(String message, Throwable cause) 

संदेश आपके "दो प्रतिशत" है और आप catched अपवाद शामिल , जो एक स्टैकट्रैक प्रिंटआउट

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