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的处理程序可能会静静地吃异常!