54、錯誤處理-【源碼流程】異常處理流程
#### 異常處理流程概述
1. **執行目標方法**:
? ?- 程序執行目標方法,期間若發生異常,會被捕獲并記錄,標志當前請求結束。
? ?- 將異常信息賦值給 `dispatchException` 變量。
2. **進入視圖解析流程**:
? ?- 調用 `processDispatchResult` 方法,處理請求結果和異常。
3. **處理異常**:
? ?- **遍歷異常解析器**:
? ? ?- 調用所有注冊的 `HandlerExceptionResolver` 解析器,嘗試處理異常。
? ?- **系統默認異常解析器**:
? ? ?- `DefaultErrorAttributes` 將異常信息保存到 `request` 域的 `ERROR_ATTRIBUTE` 中,并返回 `null`。
? ? ?- 由于默認情況下沒有其他解析器能處理異常,異常會被繼續拋出。
4. **轉發到錯誤處理頁面**:
? ?- 底層檢測到未處理的異常后,會轉發請求到 `/error` 路徑。
? ?- `BasicErrorController` 處理 `/error` 請求:
? ? ?- 獲取異常信息,設置響應狀態碼。
? ? ?- 查找并渲染錯誤頁面視圖:
? ? ? ?- 若存在對應的錯誤頁面(如 `error/500.html`),則返回該頁面。
? ? ? ?- 若未找到,則返回默認的 `error` 視圖。
#### 關鍵組件
1. **`HandlerExceptionResolver`**:
? ?- 異常解析器接口,用于處理控制器中拋出的異常。
? ?- `DefaultErrorAttributes` 實現了該接口,負責保存異常信息。
2. **`BasicErrorController`**:
? ?- 處理 `/error` 請求的控制器,負責返回錯誤響應。
? ?- 根據請求類型和錯誤信息,選擇合適的視圖進行渲染。
3. **`DefaultErrorViewResolver`**:
? ?- 默認的錯誤視圖解析器,根據響應狀態碼查找對應的錯誤頁面。
#### 總結
該異常處理流程通過多層機制,確保異常信息能夠被捕獲并展示給用戶或開發者,提升了應用程序的健壯性和可維護性。