在Java中,是否可以在同一个catch块中捕获两个异常?

在Java中,是否可以在同一个catch块中捕获两个异常?,java,exception-handling,try-catch,Java,Exception Handling,Try Catch,我需要捕获两个异常,因为它们需要相同的处理逻辑。我想做一些类似的事情: catch (Exception e, ExtendsRuntimeException re) { // common logic to handle both exceptions } 是否可以避免在每个catch块中重复处理程序代码?Java 7及更高版本 从Java7开始支持 语法是: try { // stuff } catch (Exception1 | Exception2 ex) {

我需要捕获两个异常,因为它们需要相同的处理逻辑。我想做一些类似的事情:

catch (Exception e, ExtendsRuntimeException re) {
    // common logic to handle both exceptions
}
是否可以避免在每个catch块中重复处理程序代码?

Java 7及更高版本 从Java7开始支持

语法是:

try {
     // stuff
} catch (Exception1 | Exception2 ex) {
     // Handle both exceptions
}
ex
的静态类型是所列异常中最特殊的常见超类型。有一个很好的特性,如果您在catch中重新调用
ex
,编译器知道只能抛出列出的异常中的一个


Java6及更早版本 在Java7之前,有一些方法可以处理这个问题,但它们往往不雅观,并且有局限性

方法#1 如果异常处理程序需要访问在
try
之前声明的局部变量,那么这会变得混乱。如果处理程序方法需要重新显示异常(并检查异常),那么签名就会遇到严重问题。具体来说,
handleException
必须声明为抛出
SuperException
。。。这可能意味着您必须更改封闭方法的签名,等等

进近#2 再一次,我们有一个潜在的签名问题

方法#3
如果省略了
else
部分(例如,因为目前没有
SuperException
的其他子类型),代码将变得更脆弱。如果对异常层次结构进行了重新组织,那么这个没有
else
的处理程序可能会以静默方式吃掉异常

如果您不使用java 7,您可以将异常处理提取到一个方法中,这样您至少可以最小化重复

try {
   // try something
}
catch(ExtendsRuntimeException e) { handleError(e); }
catch(Exception e) { handleError(e); }

Java对于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。

包括在同一块中捕获多个异常

 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语句。下面的示例显示了如何实现此功能

try {
// some instructions
} catch(ATypeException|BTypeException|CTypeException ex) {
   throw e;
}
因此,单个catch子句中的多个异常不仅简化了代码,而且减少了代码的冗余。 我发现这篇文章很好地解释了这个特性及其实现。
这可能对你也有帮助。

好答案+1。示例代码没有意义。如果您的命名约定很好,那么
ExtendsRuntimeException
就是
异常。因此,不需要第一个挡块。更好的示例是catch(runtimeexceptionae){handleAB(e);}catch(runtimeexceptionbe){handleAB(e);}catch(runtimeexceptionce){handleC(e);}`不可能将它们全部折叠成
catch(RuntimeException e)
。即使使用java 7,这种方法也可能是必要的。例如,如果您希望以相同的方式处理
IndexOutOfBoundException
和(非
RuntimeException
Throwable
,但希望以不同的方式处理(非
IndexOutOfBoundsException
RuntimeException
,那么新的Java7语法就没有用处了。我认为这比jeff的回答更具可读性。你应该避免捕获过于广泛的异常,这正是Java7改变的动机。此外,你永远不应该抓住你无法处理的事情。最后,您不应该捕获错误,因此也不应该捕获更广泛的可丢弃性。如果是这种情况,那么生成的catch块将如何处理特定类型异常所特有的函数?例如
ex.functionFromExceptionType2()
vs
ex.functionFromExceptionType1()
@Peaches491(1)绝大多数异常具有完全相同的方法集;(2) 如果你想让
Type1
Type2
有不同的行为,那么你就不能使用这个结构。我也这么认为。我只是想让你知道certain@emory我可能错了,但例外是对象。所以,您不能使用
instanceof
函数来查看您的异常对象在catch语句中属于某种类型吗?因此,您可以捕获、执行公共代码,然后使用带有
instanceof
的if块来执行不同的代码。@Sephallia U r right。这似乎有点倒退,但是你可以在catch语句中使用casting。我对这个问题感到有点惊讶,它的答案获得了如此多的支持票。你的答案晚了6个月,没有添加任何新的内容。在这样的情况下,最好只是简单地更新你认为有用的答案。你的答案晚了18个月,没有添加任何新内容。在这种情况下,最好是简单地向上投票,让你找到有用的信息。
catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}
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);
    }
}
 try {
     // your code
} catch (Exception1 | Exception2 ex) {
     // Handle 2 exceptions in Java 7
}
 try {
  // some instructions
} catch(ATypeException e) {
} catch(BTypeException e) {
} catch(CTypeException e) {
}
try {
// some instructions
} catch(ATypeException|BTypeException|CTypeException ex) {
   throw e;
}