本文源碼:GitHub·點這裏 || GitEE·點這裏git
優秀的程序代碼,都在追求高效,安全,和低錯誤率,可是程序中的異常是沒法避免的,下降異常出現的頻率是關鍵,異常出現如何處理是另外一個重要方面,Java體系中異常框架對於系統開發是十分重要的。github
面對系統異常時,不要慌亂,異常雖然是錯誤,也是系統發出的消息,標識系統的缺陷和須要改進的地方。 面試
Java的API中已經定義許多異常類,分爲兩大類,錯誤Error和異常Exception,Throwable做爲全部異常的超類,如圖:編程
Error:通常爲底層的不可恢復的類,通常此類錯誤都比較嚴重,JVM將終止其運行的線程;數組
Exception:程序自己能夠捕獲而且能夠預處理的異常,例如捕獲或者拋出;安全
幾個經典的常見的RunTimeException以下:空指針NullPointerException;數組下標越界ArrayIndexoutofBoundsException等。服務器
Java異常處理關鍵字,分別是:try、catch、finally、throw、throws。架構
應該在合適的位置處理異常,異常的處理準則以下:誰知情誰處理,誰負責誰處理,誰致使誰處理。併發
即異常在當前流程下不處理,一種是直接經過方法傳遞給調用者,throws關鍵字是用於在方法聲明上聲明拋出異常類型的,而且一次能夠聲明拋出多種類型的異常。throw關鍵字是用於方法的內部拋出一個異常對象,常在業務校驗時拋出提示。框架
須要特別說明的一點,在Spring框架中,事務觸發多數是以是否拋出異常爲標識來處理的,若是方法在事務控制內,方法內異常捕獲可是最終沒有拋出,那該事務則無效。
一般捕獲異常會使用try-catch-finally關鍵字三連操做:
Try嘗試捕獲異常:
若是語句依次執行結束,則跳過catch,在存在finally代碼塊時,則執行不然執行後續流程;
若是捕獲異常,則匹配catch中的類型,若是沒有與之匹配的catch類型,則該異常交給JVM處理,finally代碼會被執行,流程以後的代碼不會被執行;
若是捕獲異常且存在相匹配的catch類型,則跳到catch代碼塊執行,finally代碼會被執行,執行完finally代碼塊以後繼續執行後續代碼;
Catch匹配可能出現的異常類型,並在其中作補償處理,例如出現異常狀況,須要更新一個異常狀態等,若是沒有catch塊,後必須跟finally塊,處理資源釋放;
Finally不管是否捕獲異常,finally代碼會被執行,也是面試中常見的異常問題之一,例如在finally代碼塊return,或者修改返回值等,主要涉及到值傳遞和引用傳遞方面。
複雜的業務系統必備功能,異常日誌體系,用來分析運行問題,做爲系統不斷優化的核心依據,一般會記錄以下幾塊:
異常日誌記錄下來以後,還會按期進行任務分析,不斷髮現系統容易出問題的地方,而後再不斷的改進和優化。
在微服務架構系統下,某個服務故障或者異常,觸發熔斷該服務,避免引起整個微服務鏈路異常,防止整個系統服務的雪崩。以此緩解服務器資源的的壓力,以保證核心業務的正常運行。
GitHub·地址 https://github.com/cicadasmile GitEE·地址 https://gitee.com/cicadasmile