異常與錯誤處理

Java 的基本理念是“結構不佳的代碼將不能運行”。
 
發現錯誤的理想時機是在編譯階段,也就是在你試圖運行程序之前。然而,編譯期間並
不能找出所有的錯誤,餘下的問題必須在運行期間得到解決。這就需要錯誤源能通過某
種方式,把適當的信息傳遞給某個接收者,後者將知道如何正確處理這個問題。

 

使用異常所帶來的另一個相當明顯的好處是,它能使錯誤處理代碼變得更有條理。與原
先“對於同一個錯誤,要在多個地方進行檢查和處理”相比,你不必在方法調用處進行
檢查(因爲異常機制將保證捕獲這個錯誤)。並且,你只需在一個地方處理錯誤,既所
謂的“異常處理程序”(exception handler)。這種方式不僅節省代碼,而且把“描
述做什麼事”的代碼和“出了問題怎麼辦”的代碼相分離。總之,與以前的錯誤處理方
法相比,異常機制使代碼的閱讀﹑編寫和調試工作更加井井有條。 

 

“異常”(exception)這個詞有“我對此感到意外”的意思。問題出現了,你也許不
清楚該如何處理,但你的確知道不應該置之不理;你要停下來,看看是不是有別人或是
在別的地方,能夠處理這個問題。只是你在當前的環境(current context)中沒有足
夠的信息來解決這個問題,所以你就把這個問題提交到一個更高級別的環境中,這裏將
有人作出正確的決定(有點像軍隊裏的指揮系統)。

 

說白了Java異常就是對問題的歸咎,歸咎於程序員或者歸咎於用戶。//在控制檯和日誌中打出

日誌,以便問題的定位

 

對於不支持異常處理的程序語言,要想仔細檢查錯誤,你就得在每個方法調用的前後加
上設置和錯誤檢查的代碼,甚至你每次調用同一方法時也得這麼做。有了異常處理機制,
你可以把所有動作都放在 try 區塊裏然後只需在一個地方就可以捕獲所有異常。這意
味着代碼將更容易被編寫和閱讀,因爲完成任務的代碼沒有與錯誤檢查的代碼混在一起。

 

 
try {
  // Code that might generate exceptions
} catch(Type1 id1) {
  // Handle exceptions of Type1
} catch(Type2 id2) {
  // Handle exceptions of Type2
} catch(Type3 id3) {
  // Handle exceptions of Type3
}
 
// etc...

 

 
異常處理程序必須緊跟在 try 塊之後。當異常被拋出時,異常處理機制將負責搜尋參數
與異常類型相匹配的第一個處理程序。然後進入 catch 子句執行,此時認爲異常得到了
處理。一旦 catch 子句結束,則處理程序的查找過程結束。注意,只有匹配的 catch 子
句才能得到執行;這與 switch 語句不同,switch 語句需要你在每一個 case後面跟一
個 break,以避免執行後續的 case子句。
 
注意在 try塊的內部,不同的方法調用可能會產生類型相同的異常,你只需要提供一個
針對此類型的異常處理程序。

 

創建自定義異常

你不必拘泥於 Java中已有的異常類型。JDK提供的異常體系不能預見你想報告的所有
錯誤,所以你可以自己定義異常類來表示程序中可能遇到的特定問題。
 
要自己定義異常類,你必須從已有的異常類繼承,最好是選擇意思相近的異常類繼承(不
過這樣的異常並不容易找)。建立新的異常類型最簡單的方法就是讓編譯器爲你產生缺
省構造器,所以這幾乎不用寫多少代碼:

 

結果通過System.err打印到控制檯的標準錯誤流。通常這比把錯誤信息輸出到
System.out要好,因爲System.out也許會被重定向。但是把結果送到System.err,
它就不會隨System.out一起被重定向,這樣更容易被用戶注意。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章