一,為什麼要用全局異常處理?
二,應用場景是什麼?
三、如何進行全局異常捕獲和處理?
四、@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>,這樣,所有的控制器都可以用了
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLi0zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwkzX39GZhh2csATMflHLwEzX4xSZz91ZsADMx8FdsYkRGZkRG9lcvx2bjxSa2EWNhJTW1AlUxEFeVRUUfRHelRHL2EzXlpXazxyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3PnVGcq5COwYGNzUWZmJWZyYjN2QWZ4YzN4QzMiRGN2ADZwUmMk9CX2EzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL0M3Lc9CX6MHc0RHaiojIsJye.jpeg)
2、 因為<code>@ControllerAdvice</code>被<code>@Componen</code>标記,是以他可以被元件掃描到并放入Spring容器
3、 如果隻想對一部分控制器通知,比如某個包下邊的控制器,就可以這樣寫:
也可以直接寫類名
也可以傳多個類
4、 控制器通知還有一個兄弟,<code>@RestControllerAdvice</code>,如果用了它,錯誤處理方法的傳回值不會表示用的哪個視圖,而是會作為HTTP body處理,即相當于錯誤處理方法加了<code>@ResponseBody</code>注解。
5、<code>@ExceptionHandler</code>注解的方法隻能傳回一種類型,在前後端分離開發中我們通常傳回,統一傳回類型和優化錯誤的提示,我們可以封裝我們自己的傳回Map