使用Java Exception機制的正確姿式

一、異常是什麼?git

父類爲Throwable,有Error和Exception兩個子類github

Error爲系統級別的異常(錯誤)編程

Exception下有衆多子類,常見的有RuntimeException,SQLException,IOException等,其中最特殊的爲RuntimeException(運行時異常),RuntimeException爲unchecked Exception,編譯期不強制捕獲,系統會自動往上拋,如程序無處理,會自動調用e.printStackTrace(),輸出到命令行。RuntimeException之外的異常爲check Exception,調用拋出了checked Exception的方法,編譯期會強制要求對異常進行處理(try catch 或者繼續往上拋,此類異常最終必須獲得處理,不然編譯不經過)命令行

注:具體詳細結構請查看源碼或經過互聯網渠道搜索設計

二、爲何要使用異常?調試

進行代碼設計時,每一行代碼均可能產生錯誤,有些錯誤能夠當即處理,而有些錯誤可能在當前的邏輯中沒法當即處理(由於做爲方法提供者並不知道調用者出錯以後想作什麼操做),異常解決的即是這種問題,讓錯誤被延遲處理,,做爲提供者只須要告訴用戶出了什麼問題,至於用戶得知問題時如何處理,無需關心。繼承

三、JDK中的異常機制開發

JDK中已有一系列的異常,是Java爲開發者提供的經常使用異常,IO,util等包中的方法也有拋出相關的checked Exception,JDK提供的RuntimeException均因編程錯誤致使,在開發者不使用自定義RuntimeException的狀況下,可經過代碼修改進行規避,從這方面看,JDK提供的RuntimeException更大的做用在於調試。get

四、如何良好的在代碼中設計異常機制?編譯器

checked Exception自己設計的出發點是極好的,經過編譯器的強制捕獲,能夠明確提醒調用者處理異常狀況。但使用此種異常後,該Exception會像病毒同樣,得不處處理後會污染大量代碼,同時也可能由於調用者的不當處理,會失去異常信息。

而某些提供者與調用者能夠處理或者經過契約能夠避免的問題也不應濫用checked Exception,只有那些程序以外的問題,程序自己沒法保證不出異常時才該使用checked Exception,例如IO,SQL等。

爲了代碼的可讀性和穩健性,結合一些資料,我我的的作法是自定義繼承自Runtime Exception的異常,同時可擴展一些功能(結合錯誤碼),把程序中的異常進行統一包裝,再利用ControllerAdvice進行統一的捕獲處理,同時該異常也能夠做爲全部程序非正常狀況終止的出口。

具體使用方法,請參考此demo:https://github.com/Zhangchiii...

相關文章
相關標籤/搜索