我们在项目初始化的工作之一就是要自定义异常处理,用来处理项目中出现的各种异常,如业务异常、系统异常等等。
这些属于项目的通用基础代码,在任何后端中都可以复用。
1. 自定义错误码
自定义错误码,对错误进行收敛,便于前端统一处理
小技巧:
- 自定义错误码时,建议和主流的错误码含义保持一致,如HTTP错误码
- 错误码不要连续,预留一些间隔,便于后续扩展
import lombok.Getter;
@Getter
public enum ErrorCode {
SUCCESS(0, "ok"),
PARAMS_ERROR(40000, "请求参数错误"),
NOT_LOGIN_ERROR(40100, "未登录"),
NO_AUTH_ERROR(40101, "无权限"),
NOT_FOUND_ERROR(40400, "请求数据不存在"),
FORBIDDEN_ERROR(40300, "禁止访问"),
SYSTEM_ERROR(50000, "系统内部异常"),
OPERATION_ERROR(50001, "操作失败");
/**
* 状态码
*/
private final int code;
/**
* 信息
*/
private final String message;
ErrorCode(int code, String message) {
this.code = code;
this.message = message;
}
}
2. 自定义异常类
一般不建议直接抛出Java内置的RuntimeException
,而是自定义一个业务异常,和内置异常类区分开来,便于定制化输出错误信息:
import lombok.Getter;
/**
* @Description: 自定义异常类
*/
@Getter
public class BusinessException extends RuntimeException {
/**
* 状态码
*/
private final int code;
public BusinessException(int code, String message) {
super(message);
this.code = code;
}
public BusinessException(ErrorCode errorCode) {
super(errorCode.getMessage());
this.code = errorCode.getCode();
}
public BusinessException(ErrorCode errorCode, String message) {
super(message);
this.code = errorCode.getCode();
}
}
ThrowUtils
为了更方便抛出异常,可以封装一个ThrowUtils,类似断言类,简化抛异常的代码:
public class ThrowUtils {
/**
* 条件成立则抛异常
* @param condition
* @param runtimeException
*/
public static void throwIf(boolean condition, RuntimeException runtimeException) {
if (condition){
throw runtimeException;
}
}
/**
* 条件成立则抛异常
* @param condition
* @param errorCode
*/
public static void throwIf(boolean condition, ErrorCode errorCode) {
throwIf(condition, new BusinessException(errorCode));
}
/**
* 条件成立则抛异常
* @param condition
* @param errorCode
* @param message
*/
public static void throwIf(boolean condition, ErrorCode errorCode, String message) {
throwIf(condition,new BusinessException(errorCode,message));
}
}