什么是异常传播?

2022-09-03 03:54:38

什么是异常传播?我试图谷歌它,但找不到令人满意的结果。最好用Java来解释这一点。


答案 1

令人惊讶的是,在Java教程页面中,它解释了异常

异常在调用堆栈上从一个方法传播到另一个方法,直到它被捕获。因此,如果调用 、哪些调用 、哪些调用 ,并且如果抛出异常,则异常将从 d 传播到 c 再到 b 再到 a,除非这些方法之一捕获了异常。a()b()c()d()d()


答案 2

简短的回答:未捕获的异常在调用堆栈中传播,直到堆栈变为空,此传播称为异常传播。

长答案:方法引发异常后,运行时系统在调用堆栈中搜索包含可以处理异常的代码块(异常处理程序)的方法。搜索从发生错误的方法开始,然后以调用方法的相反顺序通过调用堆栈。找到适当的处理程序后,运行时系统会将异常传递给处理程序。此外,还有一点值得注意:

比方说,我们有一个方法链,其中 method3() 调用 method2() 和 method2() 调用 method1()。因此,当

1) 在 method3() 中发生异常,在 method3() 中,我们没有任何异常处理程序。

2)未捕获的异常将在堆栈中向下传播,即它将检查方法2()中的相应异常处理程序。

3) 同样在方法 2 中,如果我们没有任何异常处理程序,则异常再次向下传播到 method1() 在那里它找到异常处理程序。

enter image description here

例:

 class ExceptionPropagation{

  void method3(){
    int result = 100 / 0;  //Exception Generated
  }

  void method2(){
    method3();
  }

  void method1(){
    try{
  method2();
    } catch(Exception e){
  System.out.println("Exception is handled here");
    }
  }

  public static void main(String args[]){
  ExceptionPropagation obj=new ExceptionPropagation();
  obj.method1();
  System.out.println("Continue with Normal Flow...");
  }
}

输出:

异常在此处处理

继续正常流量...

仅传播未经检查的异常。已检查的异常引发编译错误

[1] http://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html

[2] http://www.c4learn.com/java/java-exception-propagation/