在Java中是否可以在同一个catch块中捕获两个异常?
这个问题在这里已有答案:
我可以在同一个catch子句中捕获多个Java异常吗? 9个答案
我需要捕获两个异常,因为它们需要相同的处理逻辑。 我想做的事情如下:
catch (Exception e, ExtendsRuntimeException re) {
// common logic to handle both exceptions
}
是否可以避免重复每个catch块中的处理程序代码?
6个解决方案
192 votes
Java 7及更高版本
从Java 7开始支持多异常捕获。
语法是:
try {
// stuff
} catch (Exception1 | Exception2 ex) {
// Handle both exceptions
}
静态类型else是列出的例外中最专业的常见超类型。 有一个很好的功能,如果你在catch中重新抛出SuperException,编译器知道只能抛出一个列出的异常。
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
}
如果异常处理程序需要访问在else之前声明的局部变量,则会变得混乱。如果处理程序方法需要重新抛出异常(并且已经检查),那么您将遇到严重的签名问题。 具体来说,必须将SuperException声明为抛出else ...这可能意味着您必须更改封闭方法的签名,依此类推。
方法#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 answered 2019-07-15T21:37:56Z
33 votes
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]
Francisco Spaeth answered 2019-07-15T21:38:51Z
12 votes
如果您不在Java 7上,则可以将异常处理提取到方法中 - 这样您至少可以最小化重复
try {
// try something
}
catch(ExtendsRuntimeException e) { handleError(e); }
catch(Exception e) { handleError(e); }
jeff answered 2019-07-15T21:39:15Z
2 votes
对于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);
}
}
编辑并替换Throwable with Exception。
Sarel Botha answered 2019-07-15T21:39:46Z
2 votes
在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子句中的多个异常不仅简化了代码,还减少了代码的冗余。我发现这篇文章很好地解释了这个功能及其实现。Java 7改进和更好的异常处理这对你也有帮助。
Saurab Parakh answered 2019-07-15T21:40:24Z
1 votes
[http://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html]涵盖了在同一个块中捕获多个异常。
try {
// your code
} catch (Exception1 | Exception2 ex) {
// Handle 2 exceptions in Java 7
}
我正在制作学习卡,这个帖子很有用,只是想把我的两分钱。
Eli answered 2019-07-15T21:40:55Z