SpringBoot如何優(yōu)雅地處理全局異常詳解
前言
之前用springboot的時(shí)候,只知道捕獲異常使用try{}catch,一個(gè)接口一個(gè)try{}catch,這也是大多數(shù)開發(fā)人員異常處理的常用方式,雖然屢試不爽,但會(huì)造成一個(gè)問題,就是一個(gè)Controller下面,滿屏幕的try{}catch,看著一點(diǎn)都不優(yōu)雅,一點(diǎn)都不符合小明的氣質(zhì),憋了這么久,小明今天終于決定對(duì)所有異常實(shí)施統(tǒng)一處理的方案。
開發(fā)準(zhǔn)備
JDK8、正常的springboot項(xiàng)目
代碼編寫
通用異常處理
其實(shí)Spring系列的項(xiàng)目全局異常處理方式早已存在,只不過我們一直忙于搬磚,很少停下腳步去審視這個(gè)日夜與我們相伴的朋友。為了貼合主題,本次主要針對(duì)SpringBoot全局異常處理進(jìn)行舉例說明。
SpringBoot中有一個(gè)@ControllerAdvice的注解,使用該注解即表示開啟全局異常捕獲,接下來我們只需在自定義的方法上使用@ExceptionHandler注解,并定義捕獲異常的類型,對(duì)這種類型的異常進(jìn)行統(tǒng)一的處理。
舉個(gè)例子:
假如我們需要針對(duì)NullException(空指針異常,是Java程序員最痛恨的異常,沒有之一)進(jìn)行全局處理(如下所示)。
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 處理空指針的異常
* @param req
* @param e
* @return
*/
@ExceptionHandler(value =NullPointerException.class)
public BaseResponseFacade exceptionHandler(HttpServletRequest req, NullPointerException e){
log.error("發(fā)生空指針異常!原因是:",e);
return ResponseUtil.error(ResponseCode.ERROR);
}
}
訥,就這么簡(jiǎn)單。其他可能發(fā)生的異常,都可以以這種方式處理快速處理。此處大家應(yīng)該表現(xiàn)的十分興奮,但請(qǐng)不要高興太早,因?yàn)榻酉聛?,有更令激?dòng)人心的事情。
自定義異常處理
自定義一個(gè)異常
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @Description 自定義異常
* @Date 2019-08-05 15:49
* @Created by 程序員小明
*/
@Data
@AllArgsConstructor
@Accessors(chain = true)
public class BizException extends RuntimeException {
/**
* 錯(cuò)誤碼
*/
protected Integer errorCode;
/**
* 錯(cuò)誤信息
*/
protected String errorMsg;
}
顯而易見,這個(gè)異常繼承了RuntimeException,屬于運(yùn)行時(shí)異常。細(xì)心的朋友已經(jīng)發(fā)現(xiàn),我使用了Lombok插件,非常契合今天的主題,給大家簡(jiǎn)單介紹一下:
lombok是一個(gè)可以幫助我們簡(jiǎn)化java代碼編寫的工具類,尤其是簡(jiǎn)化javabean的編寫,即通過采用注解的方式,消除代碼中的構(gòu)造方法,getter/setter等代碼,使我們寫的類更加簡(jiǎn)潔(如果使用的IDE是idea,需要安裝插件哈)。
定義過之后,我們就可以和之前處理NullException方式一樣處理我們自定義的異常。包括處理其他異常,都是這種方式。直接貼代碼。
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 處理自定義的業(yè)務(wù)異常
* @param req
* @param e
* @return
*/
@ExceptionHandler(value = BizException.class)
public BaseResponseFacade bizExceptionHandler(HttpServletRequest req, BizException e){
log.error("發(fā)生業(yè)務(wù)異常!原因是:{}",e.getErrorMsg());
return ResponseUtil.error(e.getErrorCode(),e.getErrorMsg());
}
/**
* 處理空指針的異常
* @param req
* @param e
* @return
*/
@ExceptionHandler(value =NullPointerException.class)
public BaseResponseFacade exceptionHandler(HttpServletRequest req, NullPointerException e){
log.error("發(fā)生空指針異常!原因是:",e);
return ResponseUtil.error(ResponseCode.ERROR);
}
/**
* 處理其他異常
* @param req
* @param e
* @return
*/
@ExceptionHandler(value =Exception.class)
public BaseResponseFacade exceptionHandler(HttpServletRequest req, Exception e){
log.error("未知異常!原因是:",e);
return ResponseUtil.error(ResponseCode.INTERNAL_SERVER_ERROR);
}
}
整個(gè)全局異常處理方式核心就是以上介紹這些。下面用一個(gè)Demo給大家舉個(gè)例子
@GetMapping("/test")
public BaseResponseFacade test(){
if(true){
throw new BizException(1,"error");
}
return ResponseUtil.success();
}
地址欄請(qǐng)求,進(jìn)入這個(gè)方法后,會(huì)拋出異常,此時(shí)全局異常生效,就會(huì)返回異常處理過后的信息
{"errorCode":1,"errorMsg":"error","data":null}
到此整個(gè)流程都然跑通了。當(dāng)然,好多地方都可以根據(jù)我們自身實(shí)際業(yè)務(wù)情況以此為基礎(chǔ)進(jìn)一步豐富,比如返回?cái)?shù)據(jù)可以改成跳轉(zhuǎn)某一個(gè)具體的頁面。這樣的出場(chǎng)方式是不是都很優(yōu)雅?
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
SpringBoot如何實(shí)現(xiàn)一個(gè)實(shí)時(shí)更新的進(jìn)度條的示例代碼
本文詳細(xì)的介紹了SpringBoot如何實(shí)現(xiàn)一個(gè)實(shí)時(shí)更新的進(jìn)度條,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
實(shí)體類或?qū)ο笮蛄谢瘯r(shí),忽略為空屬性的操作
這篇文章主要介紹了實(shí)體類或?qū)ο笮蛄谢瘯r(shí),忽略為空屬性的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
通過Spring Security魔幻山谷講解獲取認(rèn)證機(jī)制核心原理
這篇文章主要介紹了通過Spring Security魔幻山谷講解獲取認(rèn)證機(jī)制核心原理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
Spring ApplicationListener監(jiān)聽器用法詳解
這篇文章主要介紹了Spring ApplicationListener監(jiān)聽器用法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
基于Java SSM實(shí)現(xiàn)Excel數(shù)據(jù)批量導(dǎo)入
這篇文章主要為大家詳細(xì)介紹了基于Java SSM如何實(shí)現(xiàn)excel數(shù)據(jù)批量導(dǎo)入,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
一文徹底吃透SpringMVC中的轉(zhuǎn)發(fā)和重定向
大家應(yīng)該都知道springmvc本來就會(huì)把返回的字符串作為視圖名解析,然后轉(zhuǎn)發(fā)到對(duì)應(yīng)的視圖,這篇文章主要給大家介紹了關(guān)于SpringMVC中轉(zhuǎn)發(fā)和重定向的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04

