Java異常
P258)重拋異常會把異常拋給上一級環境中的異常處理程序,同一個try塊的後續catch子句將被忽略。此外,異常對象的所有信息都得以保持。
如果只是把當前異常對象重新拋出,那麽printStackTrace()方法顯示的將原來的異常拋出點的調用棧信息,而並非重新拋出點的信息。要更新這個信息,可以調用fillInStackTrace()方法,這將返回一個Throwable對象,它是通過把當前調用棧信息重新填入原來那個異常對象而建立的。
P259)有可能在捕獲異常之後拋出另一種異常。這麽做的話,得到的效果類似於使用fillInStackTrace(),有關原來異常發生點的信息會丟失,剩下的是與新的拋出點有點的信息。
P260)異常鏈
現在所有Throwable的子類在構造器中都可以接受一個cause(因由)對象作為參數。這個cause就用來表示原始異常,這樣通過把原始異常傳遞給新的異常,使得即使在當前位置創建並拋出新的異常,也能通過這個異常鏈追蹤到異常最初發生的位置。
在Throwable的子類中,只有三種基本的異常類提供了帶cause參數的構造器。它們是Error(用於Java虛擬機報告系統錯誤)、Exception以及RuntimeException。如果要把其他類型的異常鏈接起來,應該使用initCause()方法而不是構造器。
P266)finally
甚至在異常沒有被當前的異常處理程序捕獲的情況下,異常處理機制也會在跳到更高一層的異常處理程序之前,執行finally子句。
因為finally子句總是會執行的,所以在finally塊內部,從何處返回無關緊要。
P268)異常丟失
如果在finally塊中拋出異常,那麽在finally塊之前被捕獲的異常信息將丟失。一種更簡單的丟失異常的方式是從finally子句中返回。
P269)異常的限制
- 異常限制對構造器不起作用,子類的構造器可以拋出任何異常而不必理會基類構造器所拋出的異常。然而,因為基類構造器必須以這樣或那樣的方式被調用,派生類構造器的異常說明必須包含基類構造器的異常聲明。
- 如果父類的某個方法沒有拋出異常,那麽子類中覆蓋的對應方法也不能拋出異常。
P272)回收資源
對於在構造器階段可能會拋出異常,並且要求清理的類,最安全的使用方式是使用嵌套的try子句。其基本原則是:在創建需要清理的對象之後,立即進入一個try-finally語句塊。
Java7裏try-with-resources分析
Java7增強的try語句關閉資源
Java異常