异常捕获层次结构进程



我正在java中实现具有多个异常的异常处理。

请看以下场景:函数 f1 引发异常 e1、e2、e3 和 e4函数 f2 捕获这些。

现在我想通过捕获(异常 e1 和 e2(

显式捕获 e1,e2,其他异常应该通过捕获(异常 e(在同一块中捕获所以 e1 和 e2 是一个特例,其他都是一般例外。

那么以下方法会起作用吗?

try{
       //some work`
} catch(ExceptionType1 e1) {
      //do some special logging
} catch (ExceptionType2 e2) {
      //do some special logging
} catch(Exception e) {
     //do general logging for other exceptions
}

我的问题是异常类型1(e1(是否也会被异常e捕获?

规范写道:

如果 try 块的执行由于抛出值 V 而突然完成,则有一个选择:

  • 如果 V 的运行时类型与 try 语句的任何 catch 子句的可捕获异常类 (§5.2( 赋值兼容,则选择第一个(最左边的(此类 catch 子句。值 V 被分配给所选 catch 子句的参数,并执行该 catch 子句的 Block,然后有一个选择:

    • 如果该块正常完成,则 try 语句正常完成。

    • 如果该块由于任何原因突然完成,则 try 语句出于同样的原因突然完成。

因此,最多将执行一个 catch 块。

为此,您需要具有具有不同异常的捕获块像 NullPointerException NumberFormatException 一样,一般异常将被带有 Exception 参数的 catch 块捕获,因为 Exception 是所有异常的超类

try{
   //some work`
} catch(NullPointerException e1) {
  //do some special logging
} catch (NumberFormatException e2) {
  //do some special logging
} catch(Exception e) {
 //do general logging for other exceptions
}

使用您的代码将捕获catch(Exception e1){...}中的所有异常

其他catch块未使用。如果你想以不同的方式处理不同的Exception类型,你必须为catch(...)提供其他Exception类型。

喜欢

try{
}catch(IOException e1){
  // Do sth
}
catch(NullPointerException e2){
  // Do sth else
}
// and so on...

您不能有多个具有相同类的捕获块,即 Exception

如果您有多个Exceptions则需要为每个类创建一个单独的类,并为特定类创建 catch 块

请注意,您的 catch 块的顺序必须从更具体的类变为更通用的类

例如

try {
} catch (FileNotFoundException e) {
    System.err.println("FileNotFoundException: " + e.getMessage());       
} catch (IOException e) {
    System.err.println("Caught IOException: " + e.getMessage());
} catch (Exception e) {
  System.err.println("Caught Exception: " + e.getMessage());
} catch (Throwable e) {
  System.err.println("Caught Throwable: " + e.getMessage());
}

因此,在上面的代码中,如果异常为 FileNotFoundException则只会执行第一个catch。否则,将为Exception类的任何实例执行带有 Exceptioncatch 块,该实例未在前catch块中捕获

最后,Throwable将捕获任何非Exception固有的东西,例如Error

最新更新