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

时间:2012-06-26 15:56:50

标签: java exception-handling try-catch

我需要捕获两个异常,因为它们需要相同的处理逻辑。我想做点什么:

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

是否可以避免在每个catch块中重复处理程序代码?

6 个答案:

答案 0 :(得分:192)

Java 7及更高版本

支持

Multiple-exception catches,从Java 7开始。

语法为:

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

静态类型ex是列出的例外中最常见的常见超类型。有一个很好的功能,如果你在catch中重新抛出ex,编译器就会知道只能抛出一个列出的异常。


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
}

如果异常处理程序需要访问在try之前声明的局部变量,那么这会变得混乱。如果处理程序方法需要重新抛出异常(并且已经检查),那么您将遇到签名的严重问题。具体来说,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的其他子类型),代码就会变得更加脆弱。如果重新组织了异常层次结构,那么没有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
}

我正在制作学习卡,这个帖子很有帮助,只是想把我的两分钱。