什么是exception传播?

什么是exception传播

我试过谷歌但不满意结果。 如果可能的话,还请举一些例子来解释。 C ++,php和java语言更可取。

令人惊讶的是,它在关于exception的Java教程页面中得到了解释。

exception从一个方法传播到另一个方法,直到它被捕获为止。 因此,如果a()调用b() ,调用c() ,调用d() ,并且d()抛出exception,exception将从d传播到c到b传播到a,除非其中一个方法捕获例外。

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

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

可以说,我们有一系列方法,其中method3()调用method2(),method2()调用method1()。 所以当

1)在method3()和method3()中发生exception我们没有任何exception处理程序。

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

3)再次在method2中,如果我们没有任何exception处理程序,那么exception再次传播到method1(),在那里它找到exception处理程序。

在此处输入图像描述

例:

  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..."); } } 

输出:

这里处理exception

继续正常流程……

仅传播未经检查的exception。 检查exception抛出编译错误

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

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

每当调用方法时,就会形成堆栈,并且首先从堆栈顶部抛出exception,如果没有捕获,它会从堆栈开始向前移动,直到它没有被捕获。 如果exception在到达堆栈底部后仍未被捕获,则会传播到JVM并终止程序。

未经检查的exception会在java中自动传播。 计划>

 public class ExceptionTest { public static void main(String[] args) { method1(); System.out.println("after calling m()"); } static void method1() { method2(); } static void method2() { method3(); } static void method3() { throw new NullPointerException(); } } 

对于传播已检查的exception,方法必须使用throws关键字抛出exception。 计划>

 public class ExceptionTest { public static void main(String[] args) throws FileNotFoundException { method1(); System.out.println("after calling m()"); } static void method1() throws FileNotFoundException{ method2(); } static void method2() throws FileNotFoundException{ method3(); } static void method3() throws FileNotFoundException{ throw new FileNotFoundException(); } } 

传播未经检查的exception(NullPointerException)> 传播未经检查的异常(NullPointerException)

使用throws关键字>传播已检查的exception(FileNotFoundException) 使用throws关键字传播已检查的异常(FileNotFoundException)

来自: http : //www.javamadesoeasy.com/2015/05/exception-propagation-in-java-deep.html

当exception发生时,传播是一个过程,在这个过程中,exception从堆栈的顶部到底部被丢弃,并进入要切割的调用链,如果没有被捕获,exception再次下降到前一个方法等等,直到它被捕获或直到它到达调用堆栈的最底部。这称为exception传播。

例如,假设我们的堆栈是:

C()

B()

一个()

主要()

如果在c()方法中发生exception,并且如果它没有被处理,它将被传播到先前的b()方法,如果它没有在那里处理,它又被传播到处理exception的()方法,依此类推。

可以在main()方法,a()方法,b()方法或c()方法中的调用堆栈中的任何方法中处理exception。

回复主题

假设您有一个调用另一个对象的对象,然后调用另一个对象。 如果在任何被调用对象中抛出exception并且未捕获该exception,则该exception将传播到调用方法(如果未在任何地方捕获,则会崩溃应用程序)。

 class MyClass{ void myMethod(){ A a = new A(); a.doSomething(0); } } class A{ double doSomething(int n){ return 1/n; } } 

如果执行了myMethod方法,则会在对象A doSomething方法中抛出exception,并且exception会传播到堆栈中的调用方法(因此exception在此示例中传播到myClass myMethod )。

在构建程序时,发生错误的位置不是处理错误的最佳位置,即错误是在该位置而不是在其发生的位置处理的。