在spring boot / cloud (二) 規範響應格式以及統一異常處理這篇部落格中已經提到了使用@exceptionhandler來處理各種型別的異常,這種方式也是網際網路上廣泛的方式
今天這篇部落格,將介紹一種spring boot官方文件上的統一處理異常的方式.大家可以在spring boot 官方文件檢視介紹
在開始介紹新的方法之前 , 我們先來分析一下 , 以前的做法有那些地方是需要優化的
通常我們需要做統一異常處理的需求,大概都是要規範異常輸出,以及處理,通同一套抽象出來的邏輯來處理所有異常.
但是在當前流行restful風格介面的環境下,對異常的輸出還做了額外的乙個要求,就是針對不同的錯誤需要輸出對應的http狀態.
在前面的實現中,我們大可以指定乙個處理exception的@exceptionhandler,這樣所有異常都能囊括了,但是卻無法很好的將http狀態區分開來.
如果要實現不同的異常輸出不同的http狀態,在原來的做法裡就要將每個異常都窮舉出來,然後做不同的設定.
顯然,我們是不希望這樣做的,顯得太不聰明,不過還好,spring已經幫我們把這一步已經做掉了,我們只需處理自己關心的異常即可
@exceptionhandler
(value = 要攔截的異常.class)
@responsestatus
(響應狀態)
@responsebody
public restresponseexception
(要攔截的異常 exception)
@exceptionhandler
(value = exception.class)
@responsestatus
(500)
@responsebody
public restresponseexception
(exception exception)
在官方文件中指出,你需要實現乙個類,使用@controlleradvice標註,然後繼承至responseentityexceptionhandler類.
這個responseentityexceptionhandler類是乙個抽象類,如下是它的核心方法
}在以上的**片段中,我們可以看到handleexception方法已經把常見的異常都攔截掉了,並且做出了適當的處理,並且在最後,else分支裡,呼叫了handleexceptioninternal方法,
這個方法就是處理沒有被攔截到的異常,然後這也是我們要進行擴充套件的地方
實現exceptionhandle類,繼承至responseentityexceptionhandler,並且註解@controlleradvice
@controlleradvice
@slf4j
public
class
exceptionhandle
extends
responseentityexceptionhandler
實現exception方法,使用@exceptionhandler攔截exception,那麼在這裡,所有的異常都會進入這個方法進行處理.
然後呼叫父類的handleexception方法(上面提到的),讓spring預設的異常處理先處理一遍,如果當前的異常恰巧是被spring攔截的,那麼就用spring的預設實現處理,就無需在寫額外的**了,http狀態碼也一併的會設定好.
最後在呼叫我們即將要重寫的方法handleexceptioninternal,來處理自定義異常以及規範異常輸出
@exceptionhandler
(value = exception.class)
public
responseentityexception
(exception ex, webrequest request)
重寫handleexceptioninternal方法,
在這個方法裡面,可以向如下實現一樣,去處理專案中自定義的異常,將其規範為想要的輸出格式,
最後再呼叫父類的handleexceptioninternal方法,將控制權交還給spring,
這樣就完成了整個異常處理的流程
}在上面我們優化了統一異常處理的**,做到了只關心系統自定義異常的處理,框架和容器的異常處理,交由spring處理,簡化了**,避免了重複造輪子,同時**也更加健壯了.
統一處理異常
1.controlleradvice 註解定義全域性異常處理類 controlleradvice public class globalexceptionhandler 2.exceptionhandler 註解宣告異常處理方法,註解的方法的引數列表裡,還可以宣告很多種型別的引數 controlle...
SpringMVC異常統一處理
正文 spring 統一異常處理有 3 種方式,分別為 使用 exceptionhandler 註解 實現 handlerexceptionresolver 介面 使用 controlleradvice 註解 package com.tao.smp.exception api統一的返回結果類 pub...
springmvc異常統一處理(一)
目錄 正文 spring 統一異常處理有 3 種方式,分別為 使用 exceptionhandler 註解 實現 handlerexceptionresolver 介面 使用 controlleradvice 註解 使用該註解有乙個不好的地方就是 進行異常處理的方法必須與出錯的方法在同乙個contr...