SpringCloud异常处理统一封装我来做-使用篇
SpringCloud异常处理统一封装我来做-使用篇
简介
重复功能我来写。在 SpringBoot
项目里都有全局异常处理以及返回包装等,返回前端是带上succ
、code
、msg
、data
等字段。单个项目情况下很好解决,当微服务模块多的情况下,很多情况开发都是复制原有代码进行构建另外一个项目的,导致这些功能升级需要修改多个服务,在这个基础上,我们封装了一个组件 unified-dispose-spring-cloud-starter
里面包含了一些基础的异常处理以及返回包装功能。
依赖添加启动功能
添加依赖
ps: 实际version版本请使用最新版
最新版本:
<dependency>
<groupId>com.purgeteam.cloud</groupId>
<artifactId>unified-dispose-spring-cloud-starter</artifactId>
<version>0.3.0.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
枚举。
UserException:
继承 BusinessException
/**
* {@link RuntimeException} user 业务异常
*
* @author purgeyao
* @since 1.0
*/
@Getter
public class UserException extends BusinessException {
private String code;
private boolean isShowMsg = true;
/**
* 使用枚举传参
*
* @param errorCode 异常枚举
*/
public UserException(UserErrorCode errorCode) {
super(errorCode.getCode(), errorCode.getMessage());
this.code = errorCode.getCode();
}
}
UserErrorCode:
@Getter
public enum UserErrorCode {
/**
* 权限异常
*/
NOT_PERMISSIONS("CLOUD401","您没有操作权限"),
;
private String code;
private String message;
UserErrorCode(String code, String message) {
this.code = code;
this.message = message;
}
}
最后业务使用如下:
// 判断是否有权限抛出异常
throw new UserException(UserErrorCode.NOT_PERMISSIONS);
上述方式,抛出异常后会被模块处理。前台返回如下:
{
"succ": false, // 是否成功
"ts": 1566467628851, // 时间戳
"data": null, // 数据
"code": "CLOUD800", // 错误类型
"msg": "业务异常", // 错误描述
}