Java 異常鏈


有的時候我們會用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的環境信息了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM