天天看點

SpringBoot 如何進行全局異常捕獲和處理?

一,為什麼要用全局異常處理?

二,應用場景是什麼?

三、如何進行全局異常捕獲和處理?

四、@ControllerAdvice和@ExceptionHandler怎麼用?

六、@Validated 校驗器注解的異常?

七、自定義異常以及事務復原

在日常開發中,為了不抛出異常堆棧資訊給前端頁面,每次編寫Controller層代碼都要盡可能的catch住所有service層、dao層等異常,代碼耦合性較高,且不美觀,不利于後期維護。

為解決該問題,計劃将Controller層異常資訊統一封裝處理,且能區分對待Controller層方法傳回給前端的String、Map、JSONObject、ModelAndView等結果類型。

推薦下自己做的 Spring Boot 的實戰項目: https://github.com/YunaiV/ruoyi-vue-pro

非常友善的去掉了try catch這類冗雜難看的代碼,有利于代碼的整潔和優雅

自定義參數校驗時候全局異常處理會捕獲異常,将該異常統一傳回給前端,省略很多if else代碼

當後端出現異常時,需要傳回給前端一個友好的界面的時候就需要全局異常處理

因為異常時層層向上抛出的,為了避免控制台列印一長串異常資訊

推薦下自己做的 Spring Cloud 的實戰項目: https://github.com/YunaiV/onemall

一共有兩種方法:

Spring的AOP(較複雜)

​<code>​@ControllerAdvice​</code>​結合​<code>​@ExceptionHandler​</code>​(簡單)

1、Controller Advice字面上意思是“控制器通知”,Advice除了“勸告”、“意見”之外,還有“通知”的意思。

可以将@ExceptionHandler(辨別異常類型對應的處理方法)标記的方法提取出來,放到一個類裡,并将加上​<code>​@ControllerAdvice​</code>​,這樣,所有的控制器都可以用了

SpringBoot 如何進行全局異常捕獲和處理?

2、 因為​<code>​@ControllerAdvice​</code>​被​<code>​@Componen​</code>​标記,是以他可以被元件掃描到并放入Spring容器

3、 如果隻想對一部分​​​​控制器通知,比如某個包下邊的控制器,就可以這樣寫:

也可以直接寫類名

也可以傳多個類

4、 控制器通知還有一個兄弟,​<code>​@RestControllerAdvice​</code>​,如果用了它,錯誤處理方法的傳回值不會表示用的哪個視圖,而是會作為HTTP body處理,即相當于錯誤處理方法加了​<code>​@ResponseBody​</code>​注解。

5、​<code>​@ExceptionHandler​</code>​注解的方法隻能傳回一種類型,在前後端分離開發中我們通常傳回,統一傳回類型和優化錯誤的提示,我們可以封裝我們自己的傳回Map