java - क्या मैं एक ही पकड़ खंड में एकाधिक जावा अपवादों को पकड़ सकता हूं?




exception try-catch (6)

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

जावा में, मैं ऐसा कुछ करना चाहता हूं:

try {
    ...     
} catch (IllegalArgumentException, SecurityException, 
       IllegalAccessException, NoSuchFieldException e) {
   someCode();
}

...के बजाय:

try {
    ...     
} catch (IllegalArgumentException e) {
    someCode();
} catch (SecurityException e) {
    someCode();
} catch (IllegalAccessException e) {
    someCode();
} catch (NoSuchFieldException e) {
    someCode();
}

क्या इसे करने का कोई तरीका है?


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

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

try {
    // CODE THAT THROWS EXCEPTION
} catch (Exception e) {
    if (e instanceof RuntimeException) {
        // this exception was not expected, so re-throw it
        throw e;
    } else {
        // YOUR CODE FOR ALL CHECKED EXCEPTIONS
    } 
}

ऐसा कहा जा रहा है कि, शब्दकोष के लिए, बूलियन या कुछ अन्य चर सेट करना सबसे अच्छा हो सकता है और उस पर आधारित है जो कोशिश-पकड़ ब्लॉक के बाद कुछ कोड निष्पादित करता है।


जावा 7 से ठीक पहले नहीं, लेकिन, मैं ऐसा कुछ करूंगा:

जावा 6 और इससे पहले

try {
  //.....
} catch (Exception exc) {
  if (exc instanceof IllegalArgumentException || exc instanceof SecurityException || 
     exc instanceof IllegalAccessException || exc instanceof NoSuchFieldException ) {

     someCode();

  } else if (exc instanceof RuntimeException) {
     throw (RuntimeException) exc;     

  } else {
    throw new RuntimeException(exc);
  }

}



जावा 7

try {
  //.....
} catch ( IllegalArgumentException | SecurityException |
         IllegalAccessException |NoSuchFieldException exc) {
  someCode();
}

नहीं, प्रति ग्राहक एक।

जब तक आप सभी मामलों में एक ही कार्रवाई करते हैं, तब तक आप java.lang.Exception की तरह एक सुपरक्लास पकड़ सकते हैं।

try {
    // some code
} catch(Exception e) { //All exceptions are caught here as all are inheriting java.lang.Exception
    e.printStackTrace();
}

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


यदि अपवादों का पदानुक्रम है तो आप अपवादों के सभी उप-वर्गों को पकड़ने के लिए बेस क्लास का उपयोग कर सकते हैं। अपमानजनक मामले में आप सभी जावा अपवादों को पकड़ सकते हैं:

try {
   ...
} catch (Exception e) {
   someCode();
}

एक और आम मामले में यदि रिपोजिटरीएक्सप्शन बेस क्लास है और PathNotFoundException एक व्युत्पन्न कक्षा है तो:

try {
   ...
} catch (RepositoryException re) {
   someCode();
} catch (Exception e) {
   someCode();
}

उपर्युक्त कोड एक प्रकार के अपवाद हैंडलिंग के लिए रिपोजिटरीएक्सप्शन और पथनोटफाउंड अपवाद को पकड़ लेगा और अन्य सभी अपवाद एक साथ लम्बे हुए हैं। जावा 7 के बाद से, @ ऑस्करराइज़ के उत्तर के अनुसार:

try { 
  ...
} catch( IOException | SQLException ex ) { 
  ...
}

जावा 7 के बाद से यह संभव है। कोशिश-पकड़ ब्लॉक के लिए वाक्यविन्यास है:

try { 
  ...
} catch (IOException | SQLException ex) { 
  ...
}

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

संपादित करें: ध्यान दें कि जावा 7 में, आप एक्सेप्शन ए और अपवाद बी को उसी ब्लॉक में नहीं पकड़ सकते हैं यदि अपवाद बी विरासत में मिला है, या तो सीधे या परोक्ष रूप से, अपवाद से। संकलक शिकायत करेगा: The exception ExceptionB is already caught by the alternative ExceptionA







try-catch