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应用的统一异常处理 文章。
oKong 的 SpringBoot | 第八章:统一异常、数据校验处理文章。