4

我知道你可以使用 Java 7,multi-catch但我想知道它的异常顺序是否像以前的 Java 版本一样重要?例如,我输入 Exception 然后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);
}
4

6 回答 6

5

catch(Exception | SQLException | IOException e)因为已经涵盖Exception了它的子类IOExceptionSQLException.

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

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

于 2015-07-14T11:03:03.750 回答
3

是的,顺序很重要,从孩子到父母。

请参阅以获取更多信息。

异常变量是隐式最终的,因此我们不能在 catch 块中将变量分配给不同的值。例如,下面的代码片段会给出一个编译错误

} catch (IOException | SQLException ex) {

    ex = new SQLException();

}

编译器会抛出这个错误:multi-catch parameter ex may not be assigned

不允许在 multi-catch 语句中指定同一层次结构的两个或多个异常。例如,以下代码片段将给出编译错误,因为 FileNotFoundException 是 IOException 的子类型

} catch (FileNotFoundException | IOException ex) {

    LOGGER.log(ex);

}

编译器会抛出这个错误(无论顺序如何):multi-catch statement 中的 Alternatives cannot be related by subclassing

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

} catch (IOException | Exception ex) {

    LOGGER.log(ex);

}
于 2015-07-14T11:12:50.527 回答
1

Java 中提供了多捕获功能,以消除两个不同层次异常中的代码重复。如果您出于这个原因使用它,则订购无关紧要。如果您Exception在 multi catch 块中捕获父异常类,则无需添加子异常IOException, SQLException类。

于 2015-07-14T11:26:30.653 回答
0

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

于 2015-07-14T11:05:42.067 回答
0

multicatch Exceptiontypes 由“OR”分隔,所以不,顺序无关紧要。

如果您打算以相同的方式处理所有异常类型,则仅应使用 multicatch,如果是这种情况,则顺序无关紧要。

编辑:确实,如果类型在分层行中,则只应捕获“替代”(在本例中为通用异常)类型。不过,这与他们的订单无关。

于 2015-07-14T11:02:06.447 回答
0

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

IOException和之间没有可比性SQLException,因此,您可以随心所欲地处理它们。

所以,顺序应该是:

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);
}
于 2015-07-14T11:09:51.920 回答