in Education by (1.8m points)
This question already has answers here:

Can I catch multiple Java exceptions in the same catch clause? (10 answers)

Closed 7 years ago.

I need to catch two exceptions because they require the same handling logic. I would like to do something like:

catch (Exception e, ExtendsRuntimeException re) {

    // common logic to handle both exceptions

}

Is it possible to avoid duplicating the handler code in each catch block?

JavaScript questions and answers, JavaScript questions pdf, JavaScript question bank, JavaScript questions and answers pdf, mcq on JavaScript pdf, JavaScript questions and solutions, JavaScript mcq Test , Interview JavaScript questions, JavaScript Questions for Interview, JavaScript MCQ (Multiple Choice Questions)

1 Answer

0 votes
by (1.8m points)
Java 7 and later

Multiple-exception catches are supported, starting in Java 7.

The syntax is:

try {

     // stuff

} catch (Exception1 | Exception2 ex) {

     // Handle both exceptions

}

The static type of ex is the most specialized common supertype of the exceptions listed. There is a nice feature where if you rethrow ex in the catch, the compiler knows that only one of the listed exceptions can be thrown.

Java 6 and earlier

Prior to Java 7, there are ways to handle this problem, but they tend to be inelegant, and to have limitations.

Approach #1

try {

     // stuff

} catch (Exception1 ex) {

     handleException(ex);

} catch (Exception2 ex) {

     handleException(ex);

}

public void handleException(SuperException ex) {

     // handle exception here

}

This gets messy if the exception handler needs to access local variables declared before the try. And if the handler method needs to rethrow the exception (and it is checked) then you run into serious problems with the signature. Specifically, handleException has to be declared as throwing SuperException ... which potentially means you have to change the signature of the enclosing method, and so on.

Approach #2

try {

     // stuff

} catch (SuperException ex) {

     if (ex instanceof Exception1 || ex instanceof Exception2) {

         // handle exception

     } else {

         throw ex;

     }

}

Once again, we have a potential problem with signatures.

Approach #3

try {

     // stuff

} catch (SuperException ex) {

     if (ex instanceof Exception1 || ex instanceof Exception2) {

         // handle exception

     }

}

If you leave out the else part (e.g. because there are no other subtypes of SuperException at the moment) the code becomes more fragile. If the exception hierarchy is reorganized, this handler without an else may end up silently eating exceptions!

Related questions

...