多捕获异常处理程序

时间:2015-07-14 10:59:37

标签: java exception exception-handling multi-catch

我知道自Java 7以来你可以使用multi-catch但是我想知道它的异常顺序是否与之前版本的java一样重要?例如,我放入了例外,然后是SQLExceptionIOException

try {
      // execute code that may throw 1 of the 3 exceptions below.

} catch(Exception | SQLException | IOException e) {   
    logger.log(e);

}

或者我应该这样做?

try {

    // execute code that may throw 1 of the 3 exceptions below.

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

} catch(Exception e) {
    logger.severe(e);
}

5 个答案:

答案 0 :(得分:5)

catch(Exception | SQLException | IOException e)的单个catch块没有任何意义,因为Exception已涵盖其子类IOExceptionSQLException

因此,如果您希望对所有这些异常类型进行相同的处理,catch(Exception e)就足够了。

如果你想对更通用的Exception进行不同的处理,那么你的第二个代码片段是有意义的,这里两个catch块的顺序很重要,因为你必须首先捕获更具体的异常类型。

答案 1 :(得分:2)

是订单很重要,它是从儿童到家长。

请参阅this了解更多信息。

  

异常变量是隐式最终的,因此我们无法分配   catch块中的变量到不同的值。例如,   以下代码片段将给出编译错误

} catch (IOException | SQLException ex) {

    ex = new SQLException();

}

编译器将抛出此错误:可能未分配多捕获参数ex

  

不允许指定两个或更多相同的例外   multi-catch语句中的层次结构。例如,以下内容   代码片段会产生编译错误,因为   FileNotFoundException是IOException的子类型

} catch (FileNotFoundException | IOException ex) {

    LOGGER.log(ex);

}

编译器将抛出此错误(无论顺序是什么):multi-catch语句中的替代项无法通过子类化来关联

  

Exception类是所有异常的超类型,因此我们也是   不能写

} catch (IOException | Exception ex) {

    LOGGER.log(ex);

}

答案 2 :(得分:1)

java中提供了多捕获功能,用于删除两个不同分层异常中的代码重复。如果您因此使用它,则排序无关紧要。如果要在多捕获块中捕获父异常类Exception,则无需添加子异常IOException, SQLException类。

答案 3 :(得分:0)

顺序很重要,因为如果你首先尝试捕获Exception,而你的第二个捕获是IOException,显然你永远不会遇到第二次捕获。所以订单必须是从最小的Exception到最大的。

答案 4 :(得分:0)

例外有一些层次结构。 Exception e比其他人更客观,因此,它应该是您处理的最后一个例外。

IOExceptionSQLException之间没有比较,因此,您可以随意处理它们。

所以,顺序应该是:

try {

// execute code that may throw 1 of the 3 exceptions below.

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

} catch(Exception e) {
     logger.severe(e);
}

try {

// execute code that may throw 1 of the 3 exceptions below.

} catch(SQLException e) {
     logger.log(e);

} catch(IOException e){
     logger.log(e);

} catch(Exception e) {
     logger.severe(e);
}

try {

// execute code that may throw 1 of the 3 exceptions below.

} catch(IOException e) {
     logger.log(e);

} catch(SQLException e){
     logger.log(e);

} catch(Exception e) {
     logger.severe(e);
}