欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

你必須得會(huì)的SpringBoot全局統(tǒng)一處理異常詳解

 更新時(shí)間:2023年06月14日 08:42:03   作者:bug菌  
程序在運(yùn)行的過程中,不可避免會(huì)產(chǎn)生各種各樣的錯(cuò)誤,這個(gè)時(shí)候就需要進(jìn)行異常處理,本文主要為大家介紹了SpringBoot實(shí)現(xiàn)全局統(tǒng)一處理異常的方法,需要的可以參考一下

1. 前言

今天和大家討論的是Spring Boot如何統(tǒng)一處理異常。這里先說一下我們?yōu)槭裁葱枰纸y(tǒng)一處理異常?其實(shí)理由很簡(jiǎn)單,因?yàn)槌绦蛟谶\(yùn)行的過程中,不可避免會(huì)產(chǎn)生各種各樣的錯(cuò)誤。比如說用戶傳過來的參數(shù)不正確,無法連接上數(shù)據(jù)庫,或者在計(jì)算某個(gè)任務(wù)的時(shí)候超時(shí)等。所以我們一般需要合理的拋出各種異常信息。這些異常信息,一旦不處理,前端就會(huì)得到一個(gè)500的服務(wù)器內(nèi)部錯(cuò)誤,直接展示非常的不友好不優(yōu)雅,所以我們需要將這些異常捕獲,并告知前端,到底錯(cuò)在了哪里。另一個(gè)問題是,我們不可能直接將完整的異常信息返回,因?yàn)榭赡苌婕暗揭恍﹥?nèi)部的重要信息,不能隨意泄露,所以我們還需要對(duì)異常信息進(jìn)行過濾和轉(zhuǎn)換,值給前端返回可讀的,簡(jiǎn)潔的,準(zhǔn)確的說明信息。

這就是為什么我們需要全局異常處理。

這將又會(huì)是干貨滿滿的一期,全程無尿點(diǎn)不廢話只抓重點(diǎn)教,具有非常好的學(xué)習(xí)效果,拿好小板凳準(zhǔn)備就坐!希望學(xué)習(xí)的過程中大家認(rèn)真聽好好學(xué),學(xué)習(xí)的途中有任何不清楚或疑問的地方皆可評(píng)論區(qū)留言或私信,bug菌將第一時(shí)間給予解惑,那么廢話不多說,直接開整!Fighting!! 

2. 環(huán)境說明

本地的開發(fā)環(huán)境:

  • 開發(fā)工具:IDEA 2021.3
  • JDK版本: JDK 1.8
  • Spring Boot版本:2.3.1 RELEASE
  • Maven版本:3.8.2

3.正文

這里bug菌提供的一種思路是使用全局異常處理器。全局異常處理器不僅能夠捕獲默認(rèn)的異常,還能夠捕獲各種自定義異常。一個(gè)簡(jiǎn)單的全局異常處理器代碼如下:

3.1定義全局異常處理器

GlobalExceptionHandler.java

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    private Map<String, Object> getResult(ErrorCodeEnum e, boolean status) {
        Map<String, Object> map = new HashMap<>();
        map.put("success", status);
        map.put("code", e.getKey());
        map.put("msg", e.getValue());
        return map;
    }
    /**
     * 參數(shù)校驗(yàn)不通過
     *
     * @param e       異常信息
     * @param request 請(qǐng)求信息
     */
    @ExceptionHandler(value = ParamsException.class)
    @ResponseStatus(HttpStatus.OK)
    public Map<String, Object> handleObjectExistException(ParamsException e,
                                                          HttpServletRequest request) {
        return getResult(ErrorCodeEnum.PARAM_EXIST_EXCEPTION, false);
    }
    /**
     * 用戶校驗(yàn)不通過
     *
     * @param e       異常信息
     * @param request 請(qǐng)求信息
     */
    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler(value = TokenExpireException.class)
    public Map<String, Object> handle(TokenExpireException e, HttpServletRequest request) {
        return getResult(ErrorCodeEnum.USER_NOT_LOGIN, false);
    }
    /**
     * 全局異常處理
     *
     * @param e       異常信息
     * @param request 請(qǐng)求信息
     */
    @ResponseStatus()
    @ExceptionHandler(value = Throwable.class)
    public Map<String, Object> handle(Exception e, HttpServletRequest request) {
        return getResult(ErrorCodeEnum.SYSTEM_ERROR, false);
    }
}

這里我對(duì)所有的異常信息返回結(jié)果都做了統(tǒng)一的處理,只返回success,code,msg三個(gè)字段。在內(nèi)部封裝了一個(gè)getResult私有方法,便于統(tǒng)一處理,然后分別使用不同的方法處理不同的異常信息,比如ParamsException,TokenExpireException,SystemRunningException等

以上的這仨皆屬于自定義異常,代碼如下:

3.2定義參數(shù)異常ParamsException類

這里先定義參數(shù)異常的信息撲捉,思路也比較簡(jiǎn)單,就是除了msg之外,不需要接收code,只便于更加靈活的實(shí)現(xiàn)返回值數(shù)據(jù)。

public class ParamsException extends RuntimeException {
    private static final long serialVersionUID = 1L;
    private String message;
    public ParamsException() {
    }
    public ParamsException(String msg) {
        this.message = msg;
    }
    public ParamsException(ErrorCodeEnum e) {
        this.message = e.getValue();
    }
    @Override
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
}

3.3定義異常TokenExpireException類

這里我們?cè)賮矶x一個(gè)撲捉token用戶登陸信息過期的異常類,目的是更直接用于相關(guān)token異常信息的捕捉。由于我們直接也是定義了默認(rèn)的token Error錯(cuò)誤碼枚舉,顧我們也是只需要定義msg信息的接收即可,但如果你都想自定義,那你就把對(duì)應(yīng)的code、success、msg都定義賦值也行,具體代碼如下:

package com.example.demo.exception;
import com.example.demo.enums.ErrorCodeEnum;
/**
 * 用戶登陸信息過期異常
 */
public class TokenExpireException extends RuntimeException {
    private static final long serialVersionUID = 1L;
    private String message;
    public TokenExpireException() {
    }
    public TokenExpireException(String msg) {
        this.message = msg;
    }
    public TokenExpireException(ErrorCodeEnum e) {
        this.message = e.getValue();
    }
    @Override
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
}

3.4定義一個(gè)ExceptionController測(cè)試

這里我們寫兩個(gè)接口直接模擬異常返回,查閱具體的異常信息是否被正常捕捉,然后其他的測(cè)試你們就自己玩啦,這里給大家舉個(gè)例子。

3.4.1測(cè)試參數(shù)異常

我們直接定義一個(gè)Get請(qǐng)求,然后設(shè)置一個(gè)參數(shù),我們?cè)趥髦档倪^程中,我們直接傳空,我們即可驗(yàn)證是否能捕獲參數(shù)異常的全局信息返回。

@RestController
@RequestMapping("/exception")
@Api(tags = "全局異常測(cè)試模塊", description = "全局異常測(cè)試模塊")
public class ExceptionController {
    @Autowired
    private UserService userService;
    /**
     * 根據(jù)用戶id查詢用戶信息
     */
    @GetMapping("/find-user-by-id")
    @ApiOperation(value = "根據(jù)用戶id查詢用戶信息", notes = "根據(jù)用戶id查詢用戶信息")
    public ResultResponse<UserEntity> saveUser(@RequestParam("userId") String userId) throws ParamsException {
        if (StringUtils.isBlank(userId)) {
            throw new ParamsException(PARAM_EXIST_EXCEPTION);
        }
        return new ResultResponse<>(userService.getById(userId));
    }
}

3.4.2Swagger請(qǐng)求校驗(yàn)

重啟項(xiàng)目,我們將userId參數(shù)傳空格,我們直接請(qǐng)求,可以看看接口返回體具體是啥內(nèi)容?

可以看到,正是我們展示的PARAM_EXIST_EXCEPTION(101001, "參數(shù)異常")這句,我們也可以自定義,也可以采用默認(rèn)的提示,成功的并統(tǒng)一處理了返回結(jié)果。

3.4.3測(cè)試token異常

測(cè)試代碼如下,僅供參考:

    @GetMapping("/login")
    @ApiOperation(value = "登錄", notes = "登錄")
    public ResultResponse<Boolean> login(@RequestParam("token") String token) throws TokenExpireException {
        throw new TokenExpireException();
    }

3.4.4Swagger請(qǐng)求校驗(yàn)

重啟項(xiàng)目后請(qǐng)求一遍,可以看下接口的返回值如下:

可以發(fā)現(xiàn),我們成功的捕獲到了默認(rèn)的Exception異常和自定義的TokenExpireException異常,并統(tǒng)一處理了返回結(jié)果。

兩輪測(cè)試結(jié)果比較令人滿意,希望能幫助到大家,剩下的測(cè)試或者自定義異常,你們可以大膽發(fā)揮,這里我就不一一贅述啦。

3.5附上接口返回錯(cuò)誤碼枚舉類

具體代碼如下,僅供參考:

/**
 * 接口返回錯(cuò)誤碼枚舉
 */
public enum ErrorCodeEnum implements IEnum {
    /* 系統(tǒng)異常 */
    SYSTEM_RUNNING(100000, "系統(tǒng)運(yùn)行異常"),
    SYSTEM_ERROR(101000, "系統(tǒng)未知異常"),
    PARAM_EXIST_EXCEPTION(101001, "參數(shù)異常"),
    /* token相關(guān) */
    TOKEN_IS_EMPTY(102001, "該請(qǐng)求沒有攜帶token!請(qǐng)先獲取token"),
    TOKEN_IS_INVALID(102002, "token失效,請(qǐng)重新登錄!"),
    TOKEN_IS_ERROR(102003, "非法token!請(qǐng)重新登錄!"),
    USER_NOT_LOGIN(103006, "請(qǐng)先登錄"),
    ;
    private Integer key;
    private String value;
    ErrorCodeEnum(Integer key, String value) {
        this.key = key;
        this.value = value;
    }
    @Override
    public Integer getKey() {
        return this.key;
    }
    @Override
    public String getValue() {
        return this.value;
    }
}

以上就是你必須得會(huì)的SpringBoot全局統(tǒng)一處理異常詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot統(tǒng)一處理異常的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot+Ant Design Vue實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出功能方式

    SpringBoot+Ant Design Vue實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出功能方式

    這篇文章主要介紹了SpringBoot+Ant Design Vue實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出功能方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Spring Mybatis 分頁插件使用教程

    Spring Mybatis 分頁插件使用教程

    這篇文章主要介紹了Spring Mybatis分頁插件使用教程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • 如何解決SpringMVC不能訪問html頁面

    如何解決SpringMVC不能訪問html頁面

    這篇文章主要介紹了如何解決SpringMVC不能訪問html頁面問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java多邊形重心計(jì)算

    Java多邊形重心計(jì)算

    今天小編就為大家分享一篇關(guān)于Java多邊形重心計(jì)算,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Java中File類中常用方法詳解

    Java中File類中常用方法詳解

    這篇文章主要為大家詳細(xì)介紹了File類中常用方法的程序演示,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Spring Boot如何移除內(nèi)嵌Tomcat,使用非web方式啟動(dòng)

    Spring Boot如何移除內(nèi)嵌Tomcat,使用非web方式啟動(dòng)

    這篇文章主要介紹了Spring Boot如何移除內(nèi)嵌Tomcat,使用非web方式啟動(dòng),幫助大家更好的理解和學(xué)習(xí)使用spring boot框架,感興趣的朋友可以了解下
    2021-02-02
  • Java并發(fā)編程之線程狀態(tài)介紹

    Java并發(fā)編程之線程狀態(tài)介紹

    這篇文章主要介紹了Java并發(fā)編程之線程狀態(tài),當(dāng)線程被創(chuàng)建并啟動(dòng)以后,它既不是一啟動(dòng)就進(jìn)入了執(zhí)行狀態(tài),也不是一直處于執(zhí)行狀態(tài),下面和小編一起進(jìn)入文章了解具體的相關(guān)介紹吧
    2022-04-04
  • Mybatis-Plus樂觀鎖配置流程

    Mybatis-Plus樂觀鎖配置流程

    這篇文章主要介紹了Mybatis-Plus樂觀鎖配置使用流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作有一定的參考學(xué)習(xí)價(jià)值,感興趣的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2024-01-01
  • springboot整合sentinel的方法教程

    springboot整合sentinel的方法教程

    這篇文章主要介紹了springboot整合sentinel的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java實(shí)現(xiàn)單例模式的五種方法介紹

    Java實(shí)現(xiàn)單例模式的五種方法介紹

    單例模式確保某個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。在計(jì)算機(jī)系統(tǒng)中,線程池、緩存、日志對(duì)象、對(duì)話框、打印機(jī)、顯卡的驅(qū)動(dòng)程序?qū)ο蟪1辉O(shè)計(jì)成單例
    2023-01-01

最新評(píng)論