天天看點

checked and unchecked exception

checked 和 unchecked exception 的差別,資深一點的Java程式員都知道。這裡我感興趣的是該怎麼用checked 和 unchecked exception.

最早的exception處理機制來自C++,在C中為了避免錯誤,我們會根據傳回結果或者判斷狀态(檔案操作)來保證程式的正确性。這樣在代碼中就會有大量的if/else判斷最後甚至讓讀代碼的人忘了程式片段的真正意圖。是以C++中引入了exception的處理機制。不過C++為了相容C,異常處理是選擇性的。Java是真正嚴格實作異常機制的語言。

從架構的角度什麼時候用checked exception,什麼時候用unchecked exception, 如何封裝,處理,仁者見仁,智者見智。有種選擇是不用checked exception. Think In Java作者Bruce Eckel在http://www.mindview.net/Etc/Discussions/CheckedExceptions 提到這種設計選擇。我的了解是原因有三點:1)業務邏輯不願意恢複的錯誤,比如Rod Johnson在J2EE Deveopment Without EJB中舉了一個Service Locator 中JNDI Lookup failure時直接抛出Un-Checked exception。這樣不會逼着系統處理這種異常,比如嘗試恢複或者提示使用者。2) checked exception是編譯時異常,強制要求處理,确實降低了程式出錯的可能。但有時程式中還是大量充斥這種異常處理的代碼。 3)程式員經常有意無意中丢掉了異常(簡單的列印出異常資訊,沒有思考如何進一步處理),這是程式中引入bug的一種主要來源,并且比較難找。

據說Spring中DAO的封裝中都是Runtime Exception. 不知是不是也是基于此考慮。