Like Share Discussion Bookmark Smile

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

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

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

預設錯誤頁面

瀏覽器訪問

Postman訪問


統一異常處理

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

利用@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

瀏覽器訪問

Postman訪問


自定義異常

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

編輯 CommonExceptionHandler

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

建立 MyException

自定義Exception

編輯 DemoController

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

測試

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

瀏覽器訪問

Postman訪問


其他

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

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

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