總結-java異常處理
異常處理
前言:識別錯誤,響應錯誤的一種機制,有效的異常處理能夠加強程式的健壯性,易於除錯。
異常是一種強大的除錯手段,在於回答了以下三個問題:
1,什麼出錯了?
2,那裡出錯了?
3,為什麼出錯?
在有效使用異常的情況下,異常型別回答了“什麼”被丟擲,異常堆疊跟蹤回答了“在哪“丟擲,異常資訊回答了“為什麼“會丟擲,如果你的異常沒有回答以上全部問題,那麼可能你沒有很好地使用它們。
有三個原則可以幫助你在除錯過程中最大限度地使用好異常,這三個原則是:
1,具體明確
2,提早丟擲
3,延時捕獲
例項說明:
具體明確: 捕獲異常時儘量明確也很重要。Java讓明確捕獲異常變得容易,因為我們可以對同一try塊定義多個catch塊,從而對每種異常分別進行恰當的處理。
如: File prefsFile = new File(prefsFilename);
try{
readPreferences(prefsFile);
}
catch (FileNotFoundException e){
// alert the user that the specified file
// does not exist
}
catch (EOFException e){
// alert the user that the end of the file
// was reached
}
catch (ObjectStreamException e){
// alert the user that the file is corrupted
}
catch (IOException e){
// alert the user that some other I/O
// error occurred
}
PS:
1,JCheckbook 通過使用多個catch塊來給使用者提供捕獲到異常的明確資訊。舉例來說:如果捕獲了FileNotFoundException,它可以提示使用者指定另一 個檔案,某些情況下多個catch塊帶來的額外編碼工作量可能是非必要的負擔,但在這個例子中,額外的程式碼的確幫助程式提供了對使用者更友好的響應。
2,有 時開發人員會捕獲範化異常,並顯示異常類名稱或者列印堆疊資訊以求"具體"。千萬別這麼幹!使用者看到java.io.EOFException或者堆疊資訊 只會頭疼而不是獲得幫助。應當捕獲具體的異常並且用"人話"給使用者提示確切的資訊。不過,異常堆疊倒是可以在你的日誌檔案裡列印。記住,異常和堆疊資訊是用來幫助開發人 員而不是使用者的。
提早丟擲/迅速失敗:
通過在檢測到錯誤時立刻丟擲異常來實現迅速失敗,可以有效避免不必要的物件構造或資源佔用,比如檔案或網路連線。同樣,開啟這些資源所帶來的清理操作也可以省卻。
如: public void readPreferences(String filename)
throws IllegalArgumentException{
if (filename == null){
throw new IllegalArgumentException("filename is null");
}
InputStream in = new FileInputStream(filename);
}
通過提早丟擲異常(又稱"迅速失敗"),異常得以清晰又準確。堆疊資訊立即反映出什麼出了錯(提供了非法引數值),為什麼出錯(檔名不能為空值),以及哪裡出的錯(readPreferences()的前部分)。這樣我們的堆疊資訊就能如實提供:
java.lang.IllegalArgumentException: filename is null
at jcheckbook.JCheckbook.readPreferences(JCheckbook.java:207)
at jcheckbook.JCheckbook.startup(JCheckbook.java:116)
at jcheckbook.JCheckbook.<init>(JCheckbook.java:27)
at jcheckbook.JCheckbook.main(JCheckbook.java:318)
延遲捕獲
在有條件處理異常之前過早捕獲它,通常會導致更嚴重的錯誤和其他異常。
如:public void readPreferences(String filename){
InputStream in = null;
try{
in = new FileInputStream(filename);
}
catch (FileNotFoundException e){
logger.log(e);
}
in.read(...);
}
PS:
1.上 面的程式碼在完全沒有能力從FileNotFoundException中恢復過來的情況下就捕獲了它。
2.把異常處理的責任往呼叫鏈的上游傳遞的辦法,就是在方法的throws子句宣告異常。在宣告可能丟擲的異常時,注意越具體越好。
總結技巧:
1,技巧是在合適的層面捕獲異常,以便你的程式要麼可以從異常中有意義地恢復並繼續下去,而不導致更 深入的錯誤;要麼能夠為使用者提供明確的資訊,包括引導他們從錯誤中恢復過來。如果你的方法無法勝任,那麼就不要處理異常,把它留到後面捕獲和在恰當的層面處理。
2,System.out.println是高代價的。呼叫System.out.println會降低系統吞吐量。(用log日誌記錄)
3,在生產環境中別用異常的printStackTrace()方法。printStackTrace預設會把呼叫的堆疊列印到控制檯上,在生產環境中訪問控制檯是不現實的。
異常處理的基本原則:
1,如果你不能處理異常,不要捕獲該異常。
2,如果要捕獲,應在離異常源近的地方捕獲它。(提早丟擲)
3,不要吞沒異常,什麼都不做。
4,絕對不要因為寫throws語句會讓你用起來不舒服,而不宣告需要檢查的異常。
參考大牛部落格總結出來的,希望各位多多指教,引用出處:http://www.importnew.com/1701.html