java 異常小結

本篇不打算冗長介紹各類異常,只寫出通用的應該遵循的異常處理規範(我的理解,若有錯誤歡迎指正)java

 

1. 檢查異常(checked exception),一般見到的有SQLException,IOException,InterruptedException,ConnectTimeOutException,ClassNotFoundException等等。這些異常每每是因爲數據庫,網絡和資源問題致使的,不是程序自己正常運行的狀況。這些異常被認爲是能夠恢復的,好比網絡異常能夠經過重試幾回有可能就解決了。這類異常要求程序員必須捕獲並做處理,程序員的具體處理仍是要根據業務狀況而定。
  非檢查異常(unchecked exception),常見的有NullPointerExceprion,OutOfBoundsException,IllegalArgumentExcetion,NumberFormatException等(通常這類異常繼承自RuntimeException),這些通常是程序內部的,因爲數據格式的問題產生的非正常狀況,理論上是不該該發生的,而咱們也的確能夠經過某種方式避免一些非檢查異常(數組長度判斷,非空判斷等)。非檢查異常不要求程序員必須捕獲,有時候函數頭會指明拋出的非檢查異常(可是不要求必定捕獲),有時候只在api的註釋裏面說明可能拋出的異常。這個是api設計的不一致問題。
  java區分這兩種異常,在一些時候顯得沒那麼必要,檢查異常要求強制try-catch,以及直接在函數頭上聲明出來,會讓代碼很難看。所以通常項目中使用的都是非檢查異常,有些底層的檢查異常最後也會被轉譯爲非檢查異常。非檢查異常不會污染接口,可是仍是須要處理。
 
2. 不要使用異常作流程控制
    好比不對除數作判斷,當發生異常時,再得出除數等於0或返回失敗。或者當某段代碼異常了表示進入某個分支,沒有異常就走另一分支。或者經過異常跳出循環。由於異常的try-catch是消耗資源的作法,異常針對的是非正常狀況,不該該與正常的業務代碼混用。
 
3. 異常若是能處理就內部處理了,若是不能處理就拋給調用者,而不該該catch了異常,而後打印了堆棧信息就完了。
    異常能處理,好比發生了檢查異常,咱們能夠重試屢次,若是屢次仍然失敗,就拋出;或者說一段代碼異常,沒有更高一級的調用者可以處理了,再拋出就拋給虛擬機了,此時要處理它;或者說某段代碼異常就能夠認定這個任務失敗了,這時就能夠處理之作狀態變動。
    catch了異常不處理,只打印,致使的問題就是調用者正常調用了這個方法,也正常返回了,以爲應該沒有問題了,可是實際上方法內部異常了。這時候調用者拿到錯誤的數據就會產生很是嚴重的後果。雖然有日誌打印,可是實際上業務上認爲成功了,除非任務失敗,不然若是沒有人檢查日誌就不會有人發現這段錯誤。
  
4. 保留異常現場
    異常發生時,若是肯定要catch處理它,除了記錄堆棧信息(使用日誌的項目中,須要用logger記錄,而不要e.printStackTrace(),此外,我見過只記錄e.getMessage()的,發生錯誤以後,我只能看到一個空指針異常,而看不到哪一行空指針了),還要保留異常現場。也就是說發生異常時正在作什麼操做,操做的輸入參數輸出參數是怎樣的(日誌格式強烈建議規範化,否則不統一的格式看起來很難受)。方便從參數中發現異常緣由,排查問題。
 
5. 不要有過大的try塊
    try-catch是比較消耗資源的作法(不清楚JVM的實現,有機會再研究,可是直觀地看,程序要保留異常堆棧信息,監控代碼是否異常,應該不是輕鬆的事情),
    因此只針對可能拋出異常的代碼try-catch,try-catch中不該該有太多無關操做。好比異常作狀態修改,徹底能夠用一個boolean值在catch完以後再作記錄。
 
6. 不要從頭至尾只用一種異常
    不要只用exception或者RuntimeException處理全部的異常。程序當中應該區分不一樣模塊和不一樣層的異常,好比系統異常業務異常,dao異常service異常,方便出錯的時候定位問題。另外,對異常可使用編碼來記錄異常類型和異常說明。這樣能夠用一個類/配置文件,來對異常進行管理。若是要修改異常的表示方式或者文字說明,也不用每一個類裏面亂找。將一些一些api異常或者底層的異常,轉移爲業務異常(catch以後new一個業務異常),也是常常有的。
 
7. 對try塊中申請的資源,應該要在finally中釋放掉,java7提供了try(聲明資源語句),但總之資源都應該保證退出方法時被釋放。
 
8. 記住異常是非正常狀況,若是可以避免就儘可能避免,異常只是一種保障機制,不表明咱們能夠無視業務邏輯和算法,隨便寫,寫完catch就好了。
   對於一些能夠規避的異常(空指針,非法數字格式,下標越界等),能夠經過程序判斷來避免。對於web的控制層異常,須要轉譯異常,跳轉到錯誤頁面,或者是提示前臺【內部錯誤】,不要將堆棧信息也顯示到前臺。
 
---------------------------以上----------------------------
相關文章
相關標籤/搜索