異常統一處理高階

2021-08-07 14:53:43 字數 3047 閱讀 9470

在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...