SpringBoot異常處理原始碼分析

一 什麼是異常處理

當系統內部執行時出現了不正常的情況,透過預先定義好的方案,對異常進行處理。處理方法在頁面展示不正常資訊或返回異常JSON資料。

二 異常如何處理

1 SpringBoot預設會返回帶異常描述空白頁。

2 客戶端只能接受json型別資料,SpringBoot會返回帶異常描述的JSON資料。

3 透過全域性異常處理返回異常提示訊息。

三 自定義異常處理

1 當出現異常返回自定義錯誤頁面,在SpringBoot版本2。5。4自定義頁面存放路徑如下resources/res/error。

2 定義為全域性異常註解類,當出現異常由異常註解類中的函式處理。

四 異常處理原始碼分析

1 SpringBoot預設異常處理原始碼流程

當透過瀏覽器呼叫介面,首先執行doDispatch函式,在透過反射執行目標函式時系統產生錯誤,會呼叫介面“/error”,再反射呼叫BasicErrorController例項的函式errorHtml,生成異常資訊空白頁面返回給瀏覽器。原始碼如下

SpringBoot異常處理原始碼分析

呼叫“/error”介面生成ModelAndView例項

SpringBoot異常處理原始碼分析

呼叫“/error”介面輸出預設異常提示頁面

2 SpringBoot2。5。4版本 在目錄“resources/res/error/”自定義錯誤頁面是原始碼分析。

呼叫doDispatch函式,根據request例項確認當前handler,再根據handler確認handlerAdapter例項,當呼叫目標函式介面內部發生異常時,會自動呼叫“/error”介面,執行resolveResource函式讀取預設路徑下自定義錯誤提示頁面並返回給呼叫方原始碼如下圖。

SpringBoot異常處理原始碼分析

讀取預設錯誤提示頁面

SpringBoot異常處理原始碼分析

函式呼叫情況

3 SpringBoot2。5。4版本全域性異常處理原始碼分析

1,例項化加了註解@ControllerAdvice全域性異常類

SpringBoot異常處理原始碼分析

解析配置類並註冊到beanDefenition中心

SpringBoot異常處理原始碼分析

例項化異常全域性類例項

2,執行doDispatch函式,當反射執行目標例項函式時,丟擲異常。

SpringBoot異常處理原始碼分析

3,執行函式processDispatchResult,發現異常引數變數值不為空時,迴圈取出HandlerExceptionResolver例項,執行resolveException函式。

SpringBoot異常處理原始碼分析

4,執行ExceptionHandlerExceptionResolver例項函式doResolveHandlerMethodException,反射呼叫全域性異常類函式。

SpringBoot異常處理原始碼分析