什么是异常传播?
什么是异常传播?我试图谷歌它,但找不到令人满意的结果。最好用Java来解释这一点。
令人惊讶的是,在Java教程页面中,它解释了异常。
异常在调用堆栈上从一个方法传播到另一个方法,直到它被捕获。因此,如果调用 、哪些调用 、哪些调用 ,并且如果抛出异常,则异常将从 d 传播到 c 再到 b 再到 a,除非这些方法之一捕获了异常。a()
b()
c()
d()
d()
简短的回答:未捕获的异常在调用堆栈中传播,直到堆栈变为空,此传播称为异常传播。
长答案:方法引发异常后,运行时系统在调用堆栈中搜索包含可以处理异常的代码块(异常处理程序)的方法。搜索从发生错误的方法开始,然后以调用方法的相反顺序通过调用堆栈。找到适当的处理程序后,运行时系统会将异常传递给处理程序。此外,还有一点值得注意:
比方说,我们有一个方法链,其中 method3() 调用 method2() 和 method2() 调用 method1()。因此,当
1) 在 method3() 中发生异常,在 method3() 中,我们没有任何异常处理程序。
2)未捕获的异常将在堆栈中向下传播,即它将检查方法2()中的相应异常处理程序。
3) 同样在方法 2 中,如果我们没有任何异常处理程序,则异常再次向下传播到 method1() 在那里它找到异常处理程序。
例:
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