前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Boot项目全局异常处理

Spring Boot项目全局异常处理

作者头像
Li_XiaoJin
发布2022-06-10 21:41:34
4960
发布2022-06-10 21:41:34
举报
文章被收录于专栏:Lixj's BlogLixj's Blog

全局异常处理的方式。

这个我之前做营销网站的时候就想搞了,那时异常处理有点乱,重复代码很多,想想我自己也有点问题,没有往这方面想,现在想想有点后悔,希望以后别再犯类似的错。

统一异常处理加起来倒是不麻烦,可以减少重复代码,让看来更简洁易懂。

下面的代码只是粗略写写,实际应用中需要进行适当修改,但是思路是一样的。

1、定义枚举类 ResultCodeEnum

代码语言:javascript
复制
@Getter
public enum ResultCodeEnum {
    /**
     * 错误定义
     */
    SUCCESS(1000, "成功!"),
    BODY_NOT_MATCH(4000,"请求的数据格式不符!"),
    NOT_FOUND(4004, "未找到该资源!"),
    INTERNAL_SERVER_ERROR(5000, "服务器内部错误!"),
    SERVER_BUSY(5003,"服务器正忙,请稍后再试!"),
    SERVER_ERROR(9997,"业务异常");

    private final int resultCode;

    private final String resultMsg;

    private ResultCodeEnum(int resultCode, String resultMsg) {
        this.resultCode = resultCode;
        this.resultMsg = resultMsg;
    }
}

这里只是粗略写一下。

2、自定义异常类 BizException

代码语言:javascript
复制
@Data
public class BizException extends RuntimeException {

    private final Integer resultCode;
    private final String resultMsg;

    public BizException() {
        this.resultCode = ResultCodeEnum.SERVER_ERROR.getResultCode();
        this.resultMsg = ResultCodeEnum.SERVER_ERROR.getResultMsg();
    }

    public BizException(ResultCodeEnum resultCodeEnum) {
        this.resultCode = resultCodeEnum.getResultCode();
        this.resultMsg = resultCodeEnum.getResultMsg();
    }

    public BizException(ResultCodeEnum resultCodeEnum, String msg) {
        this.resultCode = resultCodeEnum.getResultCode();
        this.resultMsg = resultCodeEnum.getResultMsg();
    }

    public BizException(int resultCode, String resultMsg) {
        this.resultCode = resultCode;
        this.resultMsg = resultMsg;
    }

}

3、定义返回类 BaseResponse

代码语言:javascript
复制
@Data
public class BaseResponse {

    private Integer resultCode;
    private String resultMsg;


    public BaseResponse() {
        this.resultCode = ResultCodeEnum.SUCCESS.getResultCode();
        this.resultMsg = ResultCodeEnum.SUCCESS.getResultMsg();
    }

    public BaseResponse(ResultCodeEnum resultCodeEnum) {
        this.resultCode = resultCodeEnum.getResultCode();
        this.resultMsg = resultCodeEnum.getResultMsg();
    }

    public BaseResponse(ResultCodeEnum resultCodeEnum, String msg) {
        this.resultCode = resultCodeEnum.getResultCode();
        this.resultMsg = msg;
    }

    public BaseResponse(int resultCode, String resultMsg) {
        this.resultCode = resultCode;
        this.resultMsg = resultMsg;
    }
}

4、定义全局异常处理类

切记要加注解 @RestControllerAdvice

代码语言:javascript
复制
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    public GlobalExceptionHandler() {
    }

    @ExceptionHandler({Throwable.class})
    public BaseResponse handleThrowable(Throwable e) {
        log.error(e.getMessage(), e);
        return new BaseResponse(ResultCodeEnum.SERVER_ERROR.getResultCode(), e.getMessage());
    }

    @ExceptionHandler({Exception.class})
    public BaseResponse handleException(Exception e) {
        log.error(e.getMessage(), e);
        return new BaseResponse(ResultCodeEnum.SERVER_BUSY.getResultCode(), e.getMessage());
    }

    @ExceptionHandler(value =NullPointerException.class)
    public BaseResponse exceptionHandler(NullPointerException e){
        log.error(e.getMessage(), e);
        return new BaseResponse(ResultCodeEnum.BODY_NOT_MATCH);
    }

    @ExceptionHandler({BizException.class})
    public BaseResponse handleBizException(BizException e) {
        return new BaseResponse(e.getResultCode(), e.getResultMsg());
    }

    @ExceptionHandler({IOException.class})
    public BaseResponse handleIoException(IOException e) {
        log.error(e.getMessage(), e);
        return new BaseResponse(ResultCodeEnum.SERVER_ERROR.getResultCode(), "IO异常!");
    }

}

5、测试

代码语言:javascript
复制
@Slf4j
@RestController
public class TestController {

    @PostMapping("test")
    public String test(@RequestBody User user) {
        if (user.getName() == null) {
            throw new BizException(4001, "name 参数不能为空");
        }

        return "success!";
    }
}

代码结构如下:

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可 Links: https://lixj.fun/archives/springboot项目全局异常处理

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-07-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、定义枚举类 ResultCodeEnum
  • 2、自定义异常类 BizException
  • 3、定义返回类 BaseResponse
  • 4、定义全局异常处理类
  • 5、测试
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档