在 Java 中,是否有可能在同一个 catch 块中捕获两个异常?
2022-08-31 09:03:21
我需要捕获两个异常,因为它们需要相同的处理逻辑。我想做这样的事情:
catch (Exception e, ExtendsRuntimeException re) {
// common logic to handle both exceptions
}
是否有可能避免在每个捕获块中重复处理程序代码?
我需要捕获两个异常,因为它们需要相同的处理逻辑。我想做这样的事情:
catch (Exception e, ExtendsRuntimeException re) {
// common logic to handle both exceptions
}
是否有可能避免在每个捕获块中重复处理程序代码?
从 Java 7 开始,支持多异常捕获。
语法为:
try {
// stuff
} catch (Exception1 | Exception2 ex) {
// Handle both exceptions
}
的静态类型是列出的异常的最专用的常见超类型。有一个很好的功能,如果你在 catch 中重新引发,编译器知道只能抛出列出的异常之一。ex
ex
在Java 7之前,有一些方法可以解决这个问题,但它们往往是不优雅的,并且有局限性。
try {
// stuff
} catch (Exception1 ex) {
handleException(ex);
} catch (Exception2 ex) {
handleException(ex);
}
public void handleException(SuperException ex) {
// handle exception here
}
如果异常处理程序需要访问在 .如果处理程序方法需要重新抛出异常(并且已检查),则签名会遇到严重的问题。具体来说,必须声明为投掷...这可能意味着您必须更改封闭方法的签名,依此类推。try
handleException
SuperException
try {
// stuff
} catch (SuperException ex) {
if (ex instanceof Exception1 || ex instanceof Exception2) {
// handle exception
} else {
throw ex;
}
}
再一次,我们在签名方面遇到了一个潜在的问题。
try {
// stuff
} catch (SuperException ex) {
if (ex instanceof Exception1 || ex instanceof Exception2) {
// handle exception
}
}
如果你省略了部分(例如,因为目前没有其他子类型),代码就会变得更加脆弱。如果重新组织异常层次结构,则此没有的处理程序可能最终会静默地吞噬异常!else
SuperException
else
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