J.J. Huang   2019-04-01   Spring Boot   瀏覽次數:次  

SpringBoot - 第十八章 | 統一異常處理

📑 目錄
  1. 預設錯誤頁面
    1. 瀏覽器訪問
    2. Postman訪問
  2. 統一異常處理
    1. 建立 CommonExceptionHandler
    2. 建立 error.html
    3. 建立 DemoController
    4. 測試
  3. 自定義異常
    1. 編輯 CommonExceptionHandler
    2. 建立 MyException
    3. 編輯 DemoController
    4. 測試
  4. 其他

我們在做Web應用的時候,請求處理過程中發生錯誤是非常常見的情況。 Spring Boot提供了一個預設的:/error,當處理中拋出異常之後,會轉到該請求中處理,根據不同的Content-Type展現不同的錯誤結果,如json請求時,直接回傳json格式參數。

預設錯誤頁面

瀏覽器訪問

SpringBoot - 第十八章 - 圖 1 (01) SpringBoot - 第十八章 - 圖 1 (01)

Postman訪問

SpringBoot - 第十八章 - 圖 2 (02) SpringBoot - 第十八章 - 圖 2 (02)

統一異常處理

預設的異常頁是對用戶或者調用者而言都是不友好的,所以一般上我們都會進行實現自己業務的異常提示訊息。

利用@ControllerAdvice和@ExceptionHandler定義一個統一異常處理類。​‌‌‌​​‌‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​​​​​​‌‌​‌​​​​‌‌​​​​​​‌‌​​​‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌‌​​​‌​​‌‌‌​​​

  • @ControllerAdvice:控制器增強,使@ExceptionHandler、@InitBinder、@ModelAttribute註解的方法應用到所有的 @RequestMapping註解的方法

  • @ExceptionHandler:異常處理器,此註解的作用是當出現其定義的異常時進行處理的方法

建立 CommonExceptionHandler

這邊針對Exception的異常做統一處理,將錯誤資訊渲染到error.html內​‌‌‌​​‌‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​​​​​​‌‌​‌​​​​‌‌​​​​​​‌‌​​​‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌‌​​​‌​​‌‌‌​​​

建立 error.html

在templates目錄下建立error.html,將請求的URL和Exception對象的message輸出

建立 DemoController

用於測試throw new Exception()的時候,是否被ExceptionHandler抓去做處理

測試

啟動應用,http://localhost:8080/demo​‌‌‌​​‌‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​​​​​​‌‌​‌​​​​‌‌​​​​​​‌‌​​​‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌‌​​​‌​​‌‌‌​​​

瀏覽器訪問

SpringBoot - 第十八章 - 圖 3 (03) SpringBoot - 第十八章 - 圖 3 (03)

Postman訪問

SpringBoot - 第十八章 - 圖 4 (04) SpringBoot - 第十八章 - 圖 4 (04)

自定義異常

不同異常之處理(如自定義異常),需要進行不同的異常處理時,可編寫多個exceptionHandler方法

編輯 CommonExceptionHandler

新增針對MyException的異常做統一處理,將資訊使用Json格式回傳respCode、respMsg、url

建立 MyException

自定義Exception​‌‌‌​​‌‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​​​​​​‌‌​‌​​​​‌‌​​​​​​‌‌​​​‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌‌​​​‌​​‌‌‌​​​

編輯 DemoController

新增針對測試throw new MyException()的時候,是否被ExceptionHandler抓去做處理並使用Json回傳

測試

啟動應用,http://localhost:8080/demoJson

瀏覽器訪問

SpringBoot - 第十八章 - 圖 5 (05) SpringBoot - 第十八章 - 圖 5 (05)

Postman訪問

SpringBoot - 第十八章 - 圖 6 (06) SpringBoot - 第十八章 - 圖 6 (06)

其他

  • 針對攔截不同的異常,進行不同的異常提示,比如NoHandlerFoundException、HttpMediaTypeNotSupportedException、AsyncRequestTimeoutException等等,這裡就不在做範例,自己可以嘗試看看。​‌‌‌​​‌‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​‌​​‌‌‌​​‌​​‌‌​​​​​​‌‌​‌​​​​‌‌​​​​​​‌‌​​​‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​​​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌‌​‌​​​​‌‌​​​‌​​‌‌‌​​​

  • 由於專案上都是才有前後端分離開發模式,所以一般上都沒有直接回傳資源頁的需求,一般上都是回傳固定的格式,如respCode、respMsg、data,前端通過判斷respCode的值進行業務判斷,是彈窗還是跳轉頁面。

註:以上參考了
程序猿DD-翟永超Spring Boot中Web应用的统一异常处理 文章。
oKongSpringBoot | 第八章:统一异常、数据校验处理文章。