我需要捕获两个异常,因为它们需要相同的处理逻辑。我想做点什么:
catch (Exception e, ExtendsRuntimeException re) {
// common logic to handle both exceptions
}
是否可以避免在每个catch块中重复处理程序代码?
答案 0 :(得分:192)
Multiple-exception catches,从Java 7开始。
语法为:
try {
// stuff
} catch (Exception1 | Exception2 ex) {
// Handle both exceptions
}
静态类型ex
是列出的例外中最常见的常见超类型。有一个很好的功能,如果你在catch中重新抛出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
的处理程序可能最终会默默地吃异常!
答案 1 :(得分:33)
Java< = 6.x只允许您为每个catch块捕获一个异常:
try {
} catch (ExceptionType name) {
} catch (ExceptionType name) {
}
文档:
每个catch块都是一个异常处理程序并处理其类型 其论点表明的例外情况。参数类型,ExceptionType, 声明处理程序可以处理的异常类型,必须是 从Throwable类继承的类的名称。
对于Java 7,您可以在一个catch块上捕获多个Exception:
catch (IOException|SQLException ex) {
logger.log(ex);
throw ex;
}
文档:
在Java SE 7及更高版本中,单个catch块可以处理多个 异常类型。此功能可以减少代码重复和减少 抓住一个过于广泛的例外的诱惑。
的参考:强> 的 http://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html
答案 2 :(得分:12)
如果您不使用java 7,则可以将异常处理提取到方法中 - 这样您至少可以最小化重复
try {
// try something
}
catch(ExtendsRuntimeException e) { handleError(e); }
catch(Exception e) { handleError(e); }
答案 3 :(得分:2)
对于Java< 7你可以使用if-else和Exception:
try {
// common logic to handle both exceptions
} catch (Exception ex) {
if (ex instanceof Exception1 || ex instanceof Exception2) {
}
else {
throw ex;
// or if you don't want to have to declare Exception use
// throw new RuntimeException(ex);
}
}
编辑并用Exception替换Throwable。
答案 4 :(得分:2)
在Java SE 7发布之前,我们习惯于使用与try块相关联的多个catch语句编写代码。 一个非常基本的例子:
try {
// some instructions
} catch(ATypeException e) {
} catch(BTypeException e) {
} catch(CTypeException e) {
}
但是现在有了Java的最新更新,我们可以在一个catch子句中处理多个异常,而不是编写多个catch语句。这是一个显示如何实现此功能的示例。
try {
// some instructions
} catch(ATypeException|BTypeException|CTypeException ex) {
throw e;
}
因此,单个catch子句中的多个异常不仅简化了代码,还减少了代码的冗余。 我发现这篇文章很好地解释了这个功能及其实现。 Improved and Better Exception Handling from Java 7 这对你也有帮助。
答案 5 :(得分:1)
http://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html涵盖了在同一个区块中捕获多个异常。
try {
// your code
} catch (Exception1 | Exception2 ex) {
// Handle 2 exceptions in Java 7
}
我正在制作学习卡,这个帖子很有帮助,只是想把我的两分钱。