在Java中,是否可以在同一个catch块中捕获两个异常?[副本]

这个问题在这里已经有答案了
我可以在同一catch子句中捕获多个Java异常吗?

(10个答案)

七年前关闭的

我需要捕获两个异常,因为它们需要相同的处理逻辑。我想做一些类似的事情:

捕获(异常e,扩展运行时异常re){
//处理这两种异常的通用逻辑
}

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

Java7及更高版本

从Java7开始,支持多个异常捕获

语法是:

试试看{
//东西
}捕获(例外1 |例外2 ex){
//处理两个异常
}

ex的静态类型是所列异常中最特殊的常见超类型。有一个很好的特性,如果您在catch中重新调用ex,编译器知道只能抛出列出的异常中的一个


Java6及更早版本

在Java7之前,有一些方法可以处理这个问题,但它们往往不雅观,并且有局限性

方法#1

试试看{
//东西
}捕获(例外1例){
手部异常(ex);
}捕获(例外2例){
手部异常(ex);
}
公共无效句柄异常(超级异常){
//在这里处理异常
}

如果异常处理程序需要访问在try之前声明的局部变量,那么这会变得混乱。如果处理程序方法需要重新显示异常(并检查异常),那么签名就会遇到严重问题。具体来说,handleException必须声明为抛出SuperException。。。这可能意味着您必须更改封闭方法的签名,等等

进近#2

试试看{
//东西
}捕获(超级例外){
如果(例外情况1的实例| |例外情况2的实例){
//处理异常
}否则{
掷骰子;
}
}

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

方法#3

试试看{
//东西
}捕获(超级例外){
如果(例外情况1的实例| |例外情况2的实例){
//处理异常
}
}

如果省略了else部分(例如,因为目前没有SuperException的其他子类型),代码将变得更脆弱。如果对异常层次结构进行了重新组织,那么这个没有else的处理程序可能会以静默方式吃掉异常

发表评论