有的時候我們會用printStackTrace來打印異常棧,有可能我們會在處理異常的時候同時又拋出一個異常。
自定義兩個異常
class MyException1 extends Exception{
}
class MyException2 extends Exception{
MyException2(Throwable throwable){
super(throwable);
}
MyException2(){
super();
}
}
MyException2 調用了父類的構造方法,目的是為了能夠傳遞一個cause進來。
接下來定義一個A 類,並在他的f()方法里調用g()方法,然后在f處理g里拋出的異常的時候再次拋出一個異常
class A{
public void f() throws MyException2{
try {
g();
} catch (MyException1 e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new MyException2();
}
}
public void g() throws MyException1{
throw new MyException1();
}
}
在catch里我們又拋出了一個MyException2的異常,這里我們先調用它的無參構造方法
接下來我們在main里跑一下
public class Main {
public static void main(String[] args) {
A a = new A();
try {
a.f();
} catch (MyException2 e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
看一下控制台
我們可以明顯的發現異常棧的內容變少了。這是因為MyException2對MyException1的環境一無所知。
那么如果MyException2 能夠持有MyException1的環境信息,這樣做起來就十分方便了,並且也形成了一條鏈,我們也成為異常鏈。
唯一要修改的就是調用MyException2的有參構造函數,把MyException1當作cause傳遞進去,這樣的話我們就能獲取到MyException1的信息了。
class A{
public void f() throws MyException2{
try {
g();
} catch (MyException1 e) {
// TODO Auto-generated catch block
e.printStackTrace();
//這里做了修改
throw new MyException2(e);
}
}
public void g() throws MyException1{
throw new MyException1();
}
}
我們再次運行
我們會發現我們已經可以持有MyException1的環境信息了