Rethowing Excetpion
在catch的block中可以使用throw继续向上抛,会忽略以后的catch块儿,不会捕获已捕捉的这个Exception。
在这种情况下,在更高的调用的时候捕获到的exception还是原来的,但是有两种情况可以改变exception的来源:1.调用e.fillInStackTrace() 2.使用throw,但是抛的是不同的exception
package com.skyon;
public class Rethrowing {
public static void f() throws Exception {
System.out.println("originating the exception in f()");
throw new Exception("throw from f()");
}
public static void g() throws Exception{
try{
f();
}catch(Exception e){
System.out.println("Inside g(), e.printStackTrace()");
e.printStackTrace();
throw e;
}
}
public static void h() throws Exception{
try{
f();
}catch(Exception e){
System.out.println("Inside h(), e.printStackTrace()");
e.printStackTrace(System.out);
throw (Exception) e.fillInStackTrace();
}
}
public static void main(String[] args) {
try{
g();
}catch(Exception e){
System.out.println("main : printStackTrace()");
e.printStackTrace(System.out);
}
try{
h();
}catch(Exception e){
e.printStackTrace();
}
}
}
>>>输出:
originating the exception in f()
java.lang.Exception: throw from f()
at com.skyon.Rethrowing.f(Rethrowing.java:6)
at com.skyon.Rethrowing.g(Rethrowing.java:11)
at com.skyon.Rethrowing.main(Rethrowing.java:30)
Inside g(), e.printStackTrace()
main : printStackTrace()
java.lang.Exception: throw from f()
at com.skyon.Rethrowing.f(Rethrowing.java:6)
at com.skyon.Rethrowing.g(Rethrowing.java:11)
at com.skyon.Rethrowing.main(Rethrowing.java:30)
originating the exception in f()
Inside h(), e.printStackTrace()
java.lang.Exception: throw from f()
at com.skyon.Rethrowing.f(Rethrowing.java:6)
at com.skyon.Rethrowing.h(Rethrowing.java:20)
at com.skyon.Rethrowing.main(Rethrowing.java:36)
java.lang.Exception: throw from f()
at com.skyon.Rethrowing.h(Rethrowing.java:24)
at com.skyon.Rethrowing.main(Rethrowing.java:36)