概述
在公司寫項目的時候發現,雖說我們異常採用了全文捕獲的方式,這一點不是很清楚,特此梳理文章來記錄下,自己學習的過程
先要會用
首先我們要思考一個問題: 它是怎麼樣子捕獲異常的?我們都知道我們前後端交互如下圖:
-
過程如下:
-
- 前端通過Http請求訪問後端
-
- spring項目通過web.xml配置接受前端請求的方式參考Jsp + Servlet的項目(以後有機會補上),將請求都映射到spring-mvc.xml這個文件中(一般情況下)
-
- 這個樣子就完成了前端到後端的映射
-
在以上步驟中我們需要進入一個前置操作那就是攔截器,在我們前端剛剛要訪問後端的時候首先是web.xml之後就需要進入攔截器(可以組成攔截器鏈)
因此,我們可以推斷攔截器也是採用了類似的機制類似於過濾器,只不過一個在前一個在後,而我們的的攔截器也恰好滿足這個特性如下圖:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-9NtHVpsk-1592134456791)(https://s1.ax1x.com/2020/06/14/tx7z0e.png)]
- Workflow interface that allows for customized handler execution chains.
- Applications can register any number of existing or custom interceptors
- for certain groups of handlers, to add common preprocessing behavior
- without needing to modify each handler implementation.
意思是說: 這是一個工作流程接口,可以去執行我們自定義的過濾鏈路,可以在這個過濾鏈路中註冊任意數量的自定義攔截器,對於整個過濾器鏈路來說,主要是爲了添加一些處理程序的通用邏輯而不是爲每一個程序都去定義一個處理器
根據方法再次做出推斷:
-
- 異常的攔截跟afterCompletion有關係,我們是否能夠根據這個方法自己處理異常再返回給前端呢?
-
- 必定用到了AOP的技術
扯得有點遠了,下面我們說下基本用法以及我的感悟
SpringBoot中的基本應用
定義異常類
public class OrderException extends RuntimeException {
private int code;
public OrderException(int code) {
this.code = code;
}
public OrderException(String message) {
super(message);
}
@Override
public String getMessage() {
return super.getMessage();
}
public int getCode() {
return this.code;
}
@Override
public String toString() {
return getMessage();
}
}
我們都知道我們最定級的異常是Throwable它下面的異常類圖如下:
我們的類OrderException是繼承RuntimeException的,RuntimeException的大體意義是: 它是那些JVM中運行的類,正常運行的,拋出異常是由程序操作不嚴謹,程序編寫有邏輯或者語法錯誤所導致的
下面看下我們的攔截器,前面已經分析過了,它的作用類比於HandlerInterceptor中的afterInterceptor(),如下代碼:
@ControllerAdvice
public class BingExceptionHandler {
// 自定義異常返回對應編碼
@ExceptionHandler(OrderException.class)
@ResponseBody
public ResultModel handlerOrderException(OrderException e) {
return new ResultModel(false,e.getMessage());
}
@ExceptionHandler(Exception.class)
@ResponseBody
public ResultModel handlerOrderOtherException(Exception e) {
return new ResultModel(false,"系統錯誤: " + e.getMessage());
}
}
下面使我們的測試方法:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-oXRGrLE7-1592134456795)(https://s1.ax1x.com/2020/06/14/tzOSO0.png)]
下面我們來探究下原理,按照我們上面所猜測的
-首先看下,ControllerAdvice這個註解:
如下:
-
- @link Component @Component
-
- @link ExceptionHandler @ExceptionHandler
-
- @link InitBinder @InitBinder
-
- @link ModelAttribute @ModelAttribute
由這三個註解組成,這三個註解有什麼功能呢?預知後事如何~請看下回分解