什么是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
每当调用方法时,就会形成堆栈,并且首先从堆栈顶部抛出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)>
使用throws关键字>传播已检查的exception(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
)。
在构建程序时,发生错误的位置不是处理错误的最佳位置,即错误是在该位置而不是在其发生的位置处理的。