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

新手上路,请多包涵

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

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

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

原文由 user710818 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 830
2 个回答

Java 7 及更高版本

从 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
}

如果异常处理程序需要访问在 try 之前声明的局部变量,这会变得很混乱。如果处理程序方法需要重新抛出异常(并且它已被检查),那么您会遇到严重的签名问题。具体来说, handleException 必须声明为 throwing 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 的处理程序可能最终会默默地吃掉异常!

原文由 Stephen C 发布,翻译遵循 CC BY-SA 4.0 许可协议

Java <= 6.x 只允许您为每个 catch 块捕获一个异常:

 try {

} catch (ExceptionType name) {

} catch (ExceptionType name) {

}

文档:

每个 catch 块都是一个异常处理程序,并处理其参数指示的异常类型。参数类型 ExceptionType 声明处理程序可以处理的异常类型,并且必须是从 Throwable 类继承的类的名称。

对于 Java 7,您可以在一个 catch 块中捕获多个异常:

 catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}

文档:

在 Java SE 7 及更高版本中,单个 catch 块可以处理不止一种类型的异常。此功能可以减少代码重复并减少捕获过于广泛的异常的诱惑。

参考: http ://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html

原文由 Francisco Spaeth 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题