Java 异常捕获层次过程

Java 异常捕获层次过程,java,spring,exception,spring-mvc,exception-handling,Java,Spring,Exception,Spring Mvc,Exception Handling,我在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 (ExceptionType

我在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
}

我的问题是ExceptionType1(e1)是否也会被异常e捕获?

要使其正常工作,您需要具有具有不同异常的捕获块 与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块 与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
-块未使用。如果要以不同的方式处理不同的
异常
-类型,则必须给出
捕获(…)
其他
异常
-类型


使用您的代码将捕获
catch(Exception e1){…}

其他
catch
-块未使用。如果要以不同的方式处理不同的
异常
-类型,则必须给出
捕获(…)
其他
异常
-类型


同一类不能有多个catch块,即
Exception

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

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

e、 g

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


最后,
Throwable
将捕获任何非
Exception
固有的内容,例如
Error
您不能有多个具有相同类的catch块,即
Exception

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

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

e、 g

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

最后,
Throwable
将捕获任何与
异常
无关的内容,例如
错误
规范:

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

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

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

    • 如果该块由于任何原因突然完成,那么try语句也会因为同样的原因突然完成

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

规范:

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

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

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

    • 如果该块由于任何原因突然完成,那么try语句也会因为同样的原因突然完成


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

对不起,我的意思是相同的,我现在编辑了问题。对不起,我的意思是相同的,我现在编辑了问题。对不起,我的意思是相同的,我现在编辑了问题,我想我已经得到了答案。对不起,我的意思是相同的,我现在编辑了问题,我想我也得到了答案。@SambhavSharma您的异常处理将在第一次捕获异常后退出。因此,如果它符合ExceptionType1,它将在相应的catch块之后退出。@SambhavSharma您的异常处理将在第一个捕获的异常之后退出。因此,如果它符合ExceptionType1,它将在相应的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());
}