SpringBoot异常处理统一封装我来做-使用篇

Posted Purgeyao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot异常处理统一封装我来做-使用篇相关的知识,希望对你有一定的参考价值。

SpringBoot异常处理统一封装我来做-使用篇

简介

重复功能我来写。在 SpringBoot 项目里都有全局异常处理以及返回包装等,返回前端是带上succcodemsgdata等字段。单个项目情况下很好解决,当微服务模块多的情况下,很多情况开发都是复制原有代码进行构建另外一个项目的,导致这些功能升级需要修改多个服务,在这个基础上,我们封装了一个组件 unified-dispose-springboot-starter 里面包含了一些基础的异常处理以及返回包装功能。

依赖添加启动功能

添加依赖
ps: 实际version版本请使用最新版
最新版本: Maven Central

点击查看最新新版本

<dependency>
  <groupId>com.purgeteam</groupId>
  <artifactId>unified-dispose-springboot-starter</artifactId>
  <version>0.1.1.RELEASE</version>
</dependency>

启动类添加 @EnableGlobalDispose 注解开启以下功能。

@EnableGlobalDispose
@SpringBootApplication
public class GlobalDisposeSpringBootApplication {

  public static void main(String[] args) {
    SpringApplication.run(GlobalDisposeSpringBootApplication.class, args);
  }

}

One 异常处理⚠️

在项目中经常出现系统异常的情况,比如NullPointerException等等。如果默认未处理的情况下,springboot会响应默认的错误提示,这样对用户体验不是友好,系统层面的错误,用户不能感知到,即使为500的错误,可以给用户提示一个类似服务器开小差的友好提示等。

模块里以及包含了一些基本的异常处理方式(及不需要做任何代码编写已经具有基本异常处理),以及一些常见的异常code,用户只需要关心业务异常处理即可,直接通过 throw new 异常 的方式抛出即可。

异常处理包含类型

# 通用500异常
Exception 类捕获 500 异常处理

# Feign 异常
FeignException 类捕获
ClientException 类捕获

# 业务自定义
BusinessException 类捕获 业务通用自定义异常

# 参数校验异常
HttpMessageNotReadableException 参数错误异常
BindException 参数错误异常

程序主动抛出异常

throw new BusinessException(BusinessErrorCode.BUSINESS_ERROR);
// 或者
throw new BusinessException("CLOUD800","没有多余的库存");

通常不建议直接抛出通用的BusinessException异常,应当在对应的模块里添加对应的领域的异常处理类以及对应的枚举错误类型。

如会员模块:
创建UserException异常类、UserErrorCode枚举、以及UserExceptionHandler统一拦截类。

UserException:

@Data
public class UserException extends RuntimeException {

  private String code;
  private boolean isShowMsg = true;

  /**
   * 使用枚举传参
   *
   * @param errorCode 异常枚举
   */
  public UserException(UserErrorCode errorCode) {
    super(errorCode.getMessage());
    this.setCode(errorCode.getCode());
  }

}

UserErrorCode:

@Getter
public enum UserErrorCode {
    /**
     * 权限异常
     */
    NOT_PERMISSIONS("CLOUD401","您没有操作权限"),
    ;

    private String code;

    private String message;

    CommonErrorCode(String code, String message) {
        this.code = code;
        this.message = message;
    }
}

UserExceptionHandler:

@Slf4j
@RestControllerAdvice
public class UserExceptionHandler {

  /**
   * UserException 类捕获
   */
  @ExceptionHandler(value = UserException.class)
  public Result handler(UserException e) {
    log.error(e.getMessage(), e);
    return Result.ofFail(e.getCode(), e.getMessage());
  }

}

最后业务使用如下:

// 判断是否有权限抛出异常
throw new UserException(UserErrorCode.NOT_PERMISSIONS);

上述方式,抛出异常后会被模块处理。前台返回如下

{
  "succ": false,        // 是否成功
  "ts": 1566467628851,  // 时间戳
  "data": null,         // 数据
  "code": "CLOUD800",   // 错误类型
  "msg": "业务异常",    // 错误描述
  "fail": true
}

Tow 统一返回封

以上是关于SpringBoot异常处理统一封装我来做-使用篇的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot - 统一格式封装及高阶全局异常处理

springboot统一响应实体封装+统一异常类管理

SpringBoot

SpringBoot全局异常统一处理反参标准化

SpringBoot全局异常统一处理反参标准化

spring boot 1.5.4 统一异常处理