最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot自定義全局異常處理器的問題總結(jié)

 更新時(shí)間:2024年01月30日 16:28:15   作者:木子dn  
Springboot框架提供兩個(gè)注解幫助我們十分方便實(shí)現(xiàn)全局異常處理器以及自定義異常,處理器會(huì)優(yōu)先處理更具體的異常類型,如果沒有找到匹配的處理器,那么它會(huì)尋找處理更一般異常類型的處理器,本文介紹SpringBoot自定義全局異常處理器的問題,一起看看吧

一、介紹

Springboot框架提供兩個(gè)注解幫助我們十分方便實(shí)現(xiàn)全局異常處理器以及自定義異常。

  • @ControllerAdvice@RestControllerAdvice(推薦)
  • @ExceptionHandler

二、實(shí)現(xiàn)

1. 定義全局異常處理器

定義GlobalExceptionHandler類,攔截所有異常。
@RestControllerAdvice注解使得你可以在GlobalExceptionHandler 中處理異常,@ExceptionHandle注解用于將指定異常綁定到處理的函數(shù)上。如下使用@ExceptionHandler(Exception.class)即對(duì)所有異常進(jìn)行捕獲處理。

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public RestErrorResponse exception(Exception e){
        //record log
        log.error("系統(tǒng)異常{}", e.getMessage(),e);
        //decode errorException
        String errMessage = "系統(tǒng)異常";
        return new RestErrorResponse(errMessage);
    }
}
@Data
@AllArgsConstructor
public class RestErrorResponse implements Serializable {
    private String errMessage;
}

事實(shí)上,寫到這里已經(jīng)可以用了,RestErrorResponse 用來承載錯(cuò)誤信息到前端,因?yàn)?code>@RestControllerAdvice已經(jīng)包含了@ResponseBody。

2. 自定義異常類

繼承RuntimeException 異常類寫一個(gè)自定義的異常類。這么做主要是能夠使用自定義的枚舉類來更優(yōu)雅的拋出錯(cuò)誤。

@Data
public class XueChengPlusException extends RuntimeException {
    private String errMessage;
    public XueChengPlusException() {
        super();
    }
    public XueChengPlusException(String errMessage) {
        super(errMessage);
        this.errMessage = errMessage;
    }
    public static void cast(CommonError commonError){
        throw new XueChengPlusException(commonError.getErrMessage());
    }
    public static void cast(String errMessage){
        throw new XueChengPlusException(errMessage);
    }
}
@Getter
public enum CommonError {
    UNKOWN_ERROR("執(zhí)行過程異常,請(qǐng)重試。"),
    PARAMS_ERROR("非法參數(shù)"),
    OBJECT_NULL("對(duì)象為空"),
    QUERY_NULL("查詢結(jié)果為空"),
    REQUEST_NULL("請(qǐng)求參數(shù)為空");
    private String errMessage;
    private CommonError( String errMessage) {
        this.errMessage = errMessage;
    }
}

同時(shí),對(duì)于GlobalExceptionHandler 也要做一些修改,一方面處理自定義異常,另一方處理其余異常。

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
    @ExceptionHandler(XueChengPlusException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public RestErrorResponse customException(XueChengPlusException e){
        //record log
        log.error("系統(tǒng)異常{}", e.getErrMessage(),e);
        //decode errorException
        String errMessage = e.getErrMessage();
        return new RestErrorResponse(errMessage);
    }
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public RestErrorResponse exception(Exception e){
        //record log
        log.error("系統(tǒng)異常{}", e.getMessage(),e);
        //decode errorException
        String errMessage = CommonError.UNKOWN_ERROR.getErrMessage();
        return new RestErrorResponse(errMessage);
    }
}

三、使用

在程序中任意地方拋出異常,controllerservice、dao層都可以,比如

throw new RuntimeException("價(jià)格不能為空且必須大于0");

這時(shí)走的就是

@ExceptionHandler(Exception.class)
    public RestErrorResponse exception(Exception e)

除此之外,可以這樣拋出自定義異常,比如

XueChengPlusException.cast(CommonError.PARAMS_ERROR);
XueChengPlusException.cast("其他的消息");
throw new XueChengPlusException(CommonError.OBJECT_NULL.getErrMessage());
throw new XueChengPlusException("其他的消息");

這時(shí)走的就是

@ExceptionHandler(XueChengPlusException.class)
    public RestErrorResponse customException(XueChengPlusException e)

四、疑問

Q:疑問,XueChengPlusException異常類繼承自RuntimeException ,而RuntimeException 繼承自Exception,為什么觸發(fā)customException而不是exception?

在這個(gè)全局異常處理器中,當(dāng)拋出一個(gè)XueChengPlusException異常時(shí),它會(huì)被customException(XueChengPlusException e)方法處理,而不是exception(Exception e)方法。

這是因?yàn)镾pring框架的異常處理機(jī)制會(huì)優(yōu)先匹配最具體的異常類型。在您的代碼中,XueChengPlusExceptionRuntimeException(以及Exception)的子類,因此它更具體。所以,當(dāng)拋出一個(gè)XueChengPlusException異常時(shí),Spring會(huì)優(yōu)先調(diào)用處理XueChengPlusException的方法,而不是處理Exception的方法。

這種行為確實(shí)表明全局異常處理器有一定的優(yōu)先級(jí)和覆蓋邏輯。具體來說,處理器會(huì)優(yōu)先處理更具體的異常類型,如果沒有找到匹配的處理器,那么它會(huì)尋找處理更一般異常類型的處理器。

到此這篇關(guān)于SpringBoot自定義全局異常處理器的文章就介紹到這了,更多相關(guān)SpringBoot全局異常處理器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot整合JWT的實(shí)現(xiàn)步驟

    Spring Boot整合JWT的實(shí)現(xiàn)步驟

    本文主要介紹了Spring Boot整合JWT,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • jsp中存取session值簡單介紹

    jsp中存取session值簡單介紹

    這篇文章主要介紹了jsp中存取session值簡單介紹,涉及request和session的域操作等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Java?Map的compute方法舉例詳解

    Java?Map的compute方法舉例詳解

    Java中的Map是一種用于存儲(chǔ)鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu),它提供了一系列的方法來操作和訪問其中的元素,下面這篇文章主要給大家介紹了關(guān)于Java?Map的compute方法舉例詳解的相關(guān)資料,需要的朋友可以參考下
    2024-06-06
  • SpringBoot整合Caffeine使用示例

    SpringBoot整合Caffeine使用示例

    Spring Boot 和 Caffeine 可以很容易地進(jìn)行整合,Caffeine 是一個(gè)現(xiàn)代化的 Java 緩存庫,提供了高性能和靈活的緩存策略,本文給大家介紹了SpringBoot整合Caffeine使用示例,需要的朋友可以參考下
    2024-07-07
  • SpringBoot項(xiàng)目執(zhí)行腳本 自動(dòng)拉取最新代碼并重啟的實(shí)例內(nèi)容

    SpringBoot項(xiàng)目執(zhí)行腳本 自動(dòng)拉取最新代碼并重啟的實(shí)例內(nèi)容

    在本篇文章里小編給大家整理的是一篇關(guān)于SpringBoot項(xiàng)目執(zhí)行腳本 自動(dòng)拉取最新代碼并重啟的實(shí)例內(nèi)容,有需要的朋友們參考下。
    2019-12-12
  • spring boot 靜態(tài)資源處理方法

    spring boot 靜態(tài)資源處理方法

    本篇文章主要介紹了spring boot 靜態(tài)資源處理方法。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • 詳解Java中的實(shí)例初始化塊(IIB)

    詳解Java中的實(shí)例初始化塊(IIB)

    在本篇文章里我們針對(duì)Java中的實(shí)例初始化塊(IIB)做想詳細(xì)分析,有需要的朋友們可以跟著學(xué)習(xí)參考下。
    2018-10-10
  • JAVA實(shí)現(xiàn)往字符串中某位置加入一個(gè)字符串

    JAVA實(shí)現(xiàn)往字符串中某位置加入一個(gè)字符串

    這篇文章主要介紹了JAVA實(shí)現(xiàn)往字符串中某位置加入一個(gè)字符串,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 阿里云主機(jī)上安裝jdk 某庫出現(xiàn)問題的解決方法

    阿里云主機(jī)上安裝jdk 某庫出現(xiàn)問題的解決方法

    今天安裝jdk到阿里云服務(wù)上,首先看下阿里云是32位還是64位的,如果是32位下載32位的包,如果是64位的下載64位的包,下面與大家分享下安裝過程中遇到問題的解決方法
    2013-06-06
  • Java基于Calendar類輸出指定年份和月份的日歷代碼實(shí)例

    Java基于Calendar類輸出指定年份和月份的日歷代碼實(shí)例

    這篇文章主要介紹了Java 使用Calendar類輸出指定年份和月份的日歷,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02

最新評(píng)論

上林县| 靖西县| 余干县| 翁牛特旗| 新竹县| 肇州县| 青岛市| 东方市| 乌拉特后旗| 思南县| 太和县| 鄯善县| 咸宁市| 申扎县| 蓝山县| 汕尾市| 察雅县| 闸北区| 山阴县| 阳原县| 彭州市| 桂林市| 乌兰察布市| 玉田县| 六枝特区| 油尖旺区| 禄丰县| 龙川县| 裕民县| 万盛区| 弋阳县| 宜川县| 榕江县| 上栗县| 兴隆县| 盈江县| 正蓝旗| 惠来县| 保定市| 长汀县| 荆州市|