在Java中是否可能在同一个catch块中捕获两个异常?

参见英文答案 > Can I catch multiple Java exceptions in the same catch clause?                                    10个答案                            我需要捕获两个异常,因为它们需要相同的处理逻辑。我想做一些事情:

catch (Exception e, ExtendsRuntimeException re) {
    // common logic to handle both exceptions
}

是否可以避免在每个catch块中重复处理程序代码?

最佳答案
Java 7和更高版本

Multiple-exception catches,从Java 7开始。

语法是:

try {
     // stuff
} catch (Exception1 | Exception2 ex) {
     // Handle both exceptions
}

ex的静态类型是所列出的异常中最专门的通用超类型。有一个很好的功能,如果你在catch中重新抛出ex,编译器知道只有一个列出的异常可以抛出。

Java 6和更早版本

在Java 7之前,有一些方法来处理这个问题,但是它们往往是不起眼的,并且有限制。

方法#1

try {
     // stuff
} catch (Exception1 ex) {
     handleException(ex);
} catch (Exception2 ex) {
     handleException(ex);
}

public void handleException(SuperException ex) {
     // handle exception here
}

如果异常处理程序需要访问在尝试之前声明的局部变量,这会变得麻烦。如果处理程序方法需要重新抛出异常(并且它被检查),那么你遇到严重的签名问题。具体来说,handleException必须声明为抛出SuperException …这可能意味着您必须更改封装方法的签名,等等。

方法#2

try {
     // stuff
} catch (SuperException ex) {
     if (ex instanceof Exception1 || ex instanceof Exception2) {
         // handle exception
     } else {
         throw ex;
     }
}

再次,我们有签名的潜在问题。

方法3

try {
     // stuff
} catch (SuperException ex) {
     if (ex instanceof Exception1 || ex instanceof Exception2) {
         // handle exception
     }
}

如果你省略else部分(例如,因为现在没有SuperException的其他子类型),代码变得更加脆弱。如果重组了异常层次结构,这个没有else的处理程序可能会静静地吃异常!

转载注明原文:在Java中是否可能在同一个catch块中捕获两个异常? - 代码日志