我需要捕获两个异常,因为它们需要相同的处理逻辑。我想做类似的事情:
catch (Exception e, ExtendsRuntimeException re) {
// common logic to handle both exceptions
}
是否可以避免在每个 catch 块中重复处理程序代码?
我需要捕获两个异常,因为它们需要相同的处理逻辑。我想做类似的事情:
catch (Exception e, ExtendsRuntimeException re) {
// common logic to handle both exceptions
}
是否可以避免在每个 catch 块中重复处理程序代码?
从 Java 7 开始支持多异常捕获。
语法是:
try {
// stuff
} catch (Exception1 | Exception2 ex) {
// Handle both exceptions
}
的静态类型ex
是列出的异常中最专业的通用超类型。有一个很好的特性,如果你ex
在 catch 中重新抛出,编译器知道只能抛出一个列出的异常。
在 Java 7 之前,有一些方法可以处理这个问题,但它们往往不够优雅,并且有局限性。
try {
// stuff
} catch (Exception1 ex) {
handleException(ex);
} catch (Exception2 ex) {
handleException(ex);
}
public void handleException(SuperException ex) {
// handle exception here
}
如果异常处理程序需要访问在try
. 如果处理程序方法需要重新抛出异常(并且已检查),那么您会遇到签名的严重问题。具体来说,handleException
必须声明为 throwing 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
),代码将变得更加脆弱。如果异常层次结构被重新组织,这个没有 an 的处理程序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
如果您不在 java 7 上,您可以将异常处理提取到方法中 - 这样您至少可以最大限度地减少重复
try {
// try something
}
catch(ExtendsRuntimeException e) { handleError(e); }
catch(Exception e) { handleError(e); }
对于 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。
在 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 改进和更好的异常处理 这也可能对您有所帮助。
http://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html涵盖在同一块中捕获多个异常。
try {
// your code
} catch (Exception1 | Exception2 ex) {
// Handle 2 exceptions in Java 7
}
我正在制作学习卡,这个帖子很有帮助,只是想投入我的两分钱。