定義異常:
盡量給自己應用量身定制一套異常類,反應各種不同的錯誤,以便構建統一的、健壯的API。
應用每層定義統一的接口異常類,而不是簡單拋出來自實現遇到的異常,否則實現一經改變,原來的異常可能會變化,接口可能也需要跟著更改。
給每個異常和錯誤定義統一的標識,如錯誤碼,方便根據錯誤碼找到詳細的錯誤信息以及支持國際化,方便統一的異常處理框架。
拋出異常:
如果一個異常是致命的,不可恢復的,或者調用者去捕獲它沒有任何益處,使用unChecked異常。
如果一個異常是可以恢復的,可以被調用者正確處理的,使用checked異常。
在使用unChecked異常時,必須在在方法聲明中詳細的說明該方法可能會拋出的unChekced異常,由調用者自己去決定是否捕獲unChecked異常
異常信息中精確描述何種操作導致失敗(如果有,最好包括參數數據),以及可能的恢復或者處理方法。
記錄異常:
異常應該在最初產生的位置記錄!
如果必須捕獲一個無法正確處理的異常,僅僅是把它封裝成另外一種異常往上拋出,不必再次把已經被記錄過的異常再次記錄。
如果捕獲到一個異常,但是這個異常是可以處理的,則無需要記錄異常
捕獲到一個未記錄過的異常或外部系統異常時,應該記錄異常的詳細信息
給應用定義統一的異常記錄類,增加額外的應用信息到異常日志。
處理異常:
異常捕獲時由子類到父類過濾逐級分開處理。
try{..}塊最好只包含可能拋出異常的語句,語句越少越好。
調用的函數可能拋出unchecked異常時,即使不捕獲異常,也應該注意使用try{...}finally{...}釋放該釋放的資源;相對checked異常,我們都記得用try{...}catch{...}finally{...}。