java 異(yi)常鏈
有的時候我們會用printStackTrace來打印異常棧,有可能我們會在處理異常的時候同時又拋出一個異常。
自定義兩個異常
class MyException1 extends Exception{
}
class MyException2 extends Exception{
MyException2(Throwable throwable){
super(throwable);
}
MyException2(){
super();
}
}
MyException2 調(diao)用了父類的(de)構造方法,目的(de)是為了能夠傳遞一(yi)個cause進來。
接下來定義一個A 類(lei),并在他(ta)的f()方(fang)法里(li)調(diao)用g()方(fang)法,然后在f處理(li)g里(li)拋(pao)出的異常的時候再次拋(pao)出一個異常
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里我(wo)們又(you)拋出了一個MyException2的異常,這里我(wo)們先調用它的無參(can)構造(zao)方法(fa)
接下(xia)來(lai)我們在main里(li)跑(pao)一(yi)下(xia)
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();
}
}
}
看一下控制臺

我們可以明顯的發現異(yi)常棧的內(nei)容變少了。這(zhe)是(shi)因為(wei)MyException2對MyException1的環境(jing)一無所(suo)知。
那么如果MyException2 能夠持有MyException1的環境信息,這樣做起來就十分方便了,并且也形成了一條鏈,我們也成為異常鏈。
唯(wei)一要修改(gai)的(de)就是調(diao)用MyException2的(de)有參構造(zao)函(han)數,把MyException1當作cause傳(chuan)遞進去,這樣的(de)話我們就能獲取(qu)到MyException1的(de)信息了(le)。
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();
}
}
我們再次運行

我們(men)會發現我們(men)已(yi)經可(ke)以持(chi)有MyException1的環(huan)境信息了
