在Java中可能在同一个catch块中捕获两个exception吗?

我需要捕捉两个exception,因为它们需要相同的处理逻辑。 我想做一些事情:

catch (Exception e, ExtendsRuntimeException re) { // common logic to handle both exceptions } 

是否有可能避免重复每个catch块中的处理程序代码?

Java 7及更高版本

从Java 7开始支持多exception捕获 。

语法是:

 try { // stuff } catch (Exception1 | Exception2 ex) { // Handle both exceptions } 

ex的静态types是列出的例外中最特殊的常见超types。 有一个很好的特性,如果你在catch中重新抛出ex ,编译器就知道只有一个列出的exception可以被抛出。


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 } 

如果exception处理程序需要访问在try之前声明的局部variables,这会变得混乱。 如果处理程序方法需要重新抛出exception(并且被检查),那么你遇到了严重的签名问题。 具体来说, handleException必须声明为SuperException …这意味着您必须更改封闭方法的签名,等等。

方法#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子types)代码变得更加脆弱。 如果exception层次被重新组织,这个没有else处理程序可能会最终默默地吃掉exception!

Java <= 6.x只允许您为每个catch块捕获一个exception:

 try { } catch (ExceptionType name) { } catch (ExceptionType name) { } 

文档:

每个catch块都是一个exception处理程序,并处理由其参数指示的exceptiontypes。 参数typesExceptionType声明处理程序可以处理的exceptiontypes,并且必须是从Throwable类inheritance的类的名称。

对于Java 7,您可以在一个catch块中捕获多个Exception:

 catch (IOException|SQLException ex) { logger.log(ex); throw ex; } 

文档:

在Java SE 7和更高版本中,单个catch块可以处理多种types的exception。 这个function可以减less代码重复,减less捕捉过度广泛exception的诱惑。

参考: http : //docs.oracle.com/javase/tutorial/essential/exceptions/catch.html

如果你不在java 7上,你可以把你的exception处理提取到一个方法 – 这样你至less可以减less重复

 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); } } 

编辑并replace可以抛出exception。

http://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html涵盖了在同一个块中捕获多个exception。;

  try { // your code } catch (Exception1 | Exception2 ex) { // Handle 2 exceptions in Java 7 } 

我正在做学习卡,而这个线程是有帮助的,只是想把我的两分钱。

在Java SE 7发布之前,我们习惯于使用与try块关联的多个catch语句编写代码。 一个非常基本的例子:

  try { // some instructions } catch(ATypeException e) { } catch(BTypeException e) { } catch(CTypeException e) { } 

但是现在用Java的最新更新,而不是写多个catch语句,我们可以在一个catch子句中处理多个exception。 这里是一个例子,展示了如何实现这个function。

 try { // some instructions } catch(ATypeException|BTypeException|CTypeException ex) { throw e; } 

因此,单个catch子句中的多个exception不仅简化了代码,还减less了代码冗余。 我发现这篇文章很好地解释了这个特性以及它的实现。 从Java 7改进和更好的exception处理这也可以帮助你。