Java中的异常栈轨迹和异常链
Java中允許對異常進(jìn)行再次拋出,以提交給上一層進(jìn)行處理,最為明顯的例子為Java的常規(guī)異常。
常規(guī)異常:有Java所定義的異常,不需要異常聲明,在未被try-catch的情況下,會被默認(rèn)上報到main()方法。
Example:
public class TestException {TestException(int i) throws ExceptionA,ExceptionB{int a[]={0,}; a[1]=1;} }當(dāng)從main()方法中調(diào)用TestException類的構(gòu)造函數(shù)的時候,會得到以下的異常提示,從中可以看出異常的冒泡機(jī)制(這是一個棧信息)。
異常的冒泡上傳機(jī)制:當(dāng)一個異常對象產(chǎn)生了以后,其會按照調(diào)用層次(一般是方法的調(diào)用層次)進(jìn)行冒泡,直到被try-catch處理,或上報至main()方法,有編譯器進(jìn)行提示。
Example:
firstThrow()提示錯誤的原因為, firstThrow()的函數(shù)聲明中包括了MyException的異常聲明,而secondThrow()中調(diào)用了firstThrow()卻未對可能拋出的異常對象提供任何處理方案,這是編譯器所不能允許發(fā)生的事情。(這也是為了保證底層異常對象在冒泡過程中,能得到合適的處理和重視!)
注意此截圖中,MyEclipse提供了兩種方式幫助fix這個程序,這兩種方式常用的異常應(yīng)對手段:
1、本方法不給予處理,將異常上報給上一層。
1 public class TestExceptionChain { 2 void firstThrow() throws MyException 3 { 4 print("Oringinally creat a MyException and throw it out"); 5 throw new MyException(); 6 7 } 8 void secondThrow() throws MyException 9 { 10 firstThrow(); 11 } 12 TestExceptionChain() throws MyException{ 13 secondThrow(); 14 } 15 } 1 public static void main(String[] args) { 2 try{ 3 4 TestExceptionChain testExceptionChain=new TestExceptionChain(); 5 } 6 catch(MyException e) 7 { 8 e.printStackTrace(); 9 print("Catch a my exception!"); 10 } 11 12 }控制臺的輸出為:
從異常棧的記錄信息可以發(fā)現(xiàn),與代碼相對應(yīng)的異常拋出機(jī)制和次序:
firstThrow()產(chǎn)生MyException對象->異常冒泡至調(diào)用其的secondThrow()->異常冒泡至調(diào)用secondThrow()的TestExceptionChain的構(gòu)造方法->冒泡至printtry的main()方法。
注意到:異常對象一直被拋出,直至在printtry的mian()方法中被try-catch捕獲!
?
2、try-catch方式,捕捉上報的異常,而后進(jìn)行相應(yīng)處理或拋出另一異常。
2、1捕獲異常后,進(jìn)行相應(yīng)處理。
Example:
1 public class TestExceptionChain { 2 void firstThrow() throws MyException 3 { 4 print("Oringinally creat a MyException and throw it out"); 5 throw new MyException(); 6 } 7 void secondThrow() 8 { 9 try 10 { 11 firstThrow(); 12 } 13 catch (MyException e) 14 { 15 print("I have just caught a MyExcepton,but i want to do nothing for it"); 16 e.printStackTrace(); 17 } 18 } 19 TestExceptionChain(){ 20 secondThrow(); 21 }從圖中可以發(fā)現(xiàn),異常在secondThrow() 中被try-catch模塊捕獲,并執(zhí)行了相應(yīng)的處理操作,所以其函數(shù)聲明中無需添加異常聲明,異常不會被上報。
故mian()方法被改寫成了以下的代碼:
1 TestExceptionChain testExceptionChain=new TestExceptionChain();注意此處異常棧的信息,表示的是異常產(chǎn)生的層次信息,并非異常信息的上報層次,因為其已經(jīng)在secondThorow()中被捕獲處理。
?
2.2 捕獲異常后,拋出另一個異常。
Example:
1 public class TestExceptionChain { 2 void firstThrow() throws MyException 3 { 4 print("Oringinally creat a MyException and throw it out"); 5 throw new MyException(); 6 } 7 void secondThrow() throws YouException 8 { 9 try 10 { 11 firstThrow(); 12 } 13 catch (MyException e) 14 { 15 print("I have just caught a MyExcepton,but i want to create a YouException and throw it out"); 16 e.printStackTrace(); 17 throw new YouException(); 18 } 19 } 20 TestExceptionChain() throws YouException{ 21 secondThrow(); 22 } 23 } 24 class MyException extends Exception{} 25 class YouException extends Exception{}從異常棧信息中可以發(fā)現(xiàn),新拋出的YouException對象是從secondThrow()中開始的。
?
*Java中還提供了fillInStackTrace()方法,用于對捕獲的異常的棧信息進(jìn)行重寫。
Example:
1 try{ 2 3 TestExceptionChain testExceptionChain=new TestExceptionChain(); 4 } 5 catch(YouException e) 6 { 7 print("Catch a YouException!"); 8 e.fillInStackTrace(); 9 e.printStackTrace(); 10 11 }?由于使用了fillInstack()方法,關(guān)于YouException的異常信息被重寫,從其被從寫處重新記錄!
?
?
?
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/airwindow/archive/2012/06/26/2564123.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Java中的异常栈轨迹和异常链的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解析css之position
- 下一篇: 数据结构与算法分析-第一章Java类(0