我需要捕获两个异常,因为它们需要相同的处理逻辑。我想做类似的事情:
catch (Exception e, ExtendsRuntimeException re) {
// common logic to handle both exceptions
}
是否可以避免在每个 catch 块中重复处理程序代码?
原文由 user710818 发布,翻译遵循 CC BY-SA 4.0 许可协议
我需要捕获两个异常,因为它们需要相同的处理逻辑。我想做类似的事情:
catch (Exception e, ExtendsRuntimeException re) {
// common logic to handle both exceptions
}
是否可以避免在每个 catch 块中重复处理程序代码?
原文由 user710818 发布,翻译遵循 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 许可协议
15 回答8.1k 阅读
8 回答6.3k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
1 回答2.1k 阅读✓ 已解决
Java 7 及更高版本
从 Java 7 开始支持 多异常捕获。
语法是:
ex
的静态类型是列出的异常中最特殊的通用超类型。有一个很好的特性,如果您在 catch 中重新抛出ex
,编译器知道只能抛出 列出 的异常之一。Java 6 及更早版本
在 Java 7 之前,有一些方法可以处理这个问题,但它们往往不够优雅,并且有局限性。
方法#1
如果异常处理程序需要访问在
try
之前声明的局部变量,这会变得很混乱。如果处理程序方法需要重新抛出异常(并且它已被检查),那么您会遇到严重的签名问题。具体来说,handleException
必须声明为 throwingSuperException
… 这可能意味着您必须更改封闭方法的签名,等等。方法#2
再一次,我们有一个潜在的签名问题。
方法#3
如果您省略
else
部分(例如,因为目前没有SuperException
的其他子类型),代码将变得更加脆弱。如果重新组织异常层次结构,这个没有else
的处理程序可能最终会默默地吃掉异常!