异常处理规范

背景和价值

  1. 设计统一的错误码结构
    规划一套通用的错误码格式,让各个服务依据此格式生成错误码,从而保障不同服务针对同一类错误生成的错误码相似。常见的错误码结构设计如下:
    三段式结构
  • 服务标识段:用来识别不同的微服务,比如用户服务用 01,订单服务用 02 等。
  • 错误类型段:表示错误的大类,像参数错误用 001,业务逻辑错误用 002,数据库错误用 003 等。
  • 具体错误子类型段:在错误类型下细分具体的错误情况,例如参数为空用 01,参数格式错误用 02 等。

示例:用户服务的参数为空错误码可设计为 0100101

  1. 创建公共错误码模块
    创建一个独立的 Maven 或 Gradle 模块,在其中定义所有可能的错误类型和对应的错误码。各个微服务引入该公共模块,从而保证使用相同的错误码定义。
    公共模块定义错误码枚举
    // 公共模块中的错误码枚举类
public enum CommonErrorCode {
    PARAM_NULL_ERROR("00101", "参数为空错误"),
    PARAM_FORMAT_ERROR("00102", "参数格式错误"),
    BUSINESS_LOGIC_ERROR("00201", "业务逻辑异常"),
    DATABASE_ERROR("00301", "数据库操作失败");

    private final String code;
    private final String message;

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

    public String getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}
  1. 服务自定义错误码前缀
    每个服务在使用公共错误码时,为其添加自身的服务标识前缀,这样既能保证同一类错误的核心部分一致,又能区分不同的服务。
    服务中使用公共错误码并添加前缀
    // 用户服务中使用公共错误码并添加服务前缀
public enum UserServiceErrorCode {
    USER_PARAM_NULL_ERROR("01" + CommonErrorCode.PARAM_NULL_ERROR.getCode(), CommonErrorCode.PARAM_NULL_ERROR.getMessage()),
    USER_BUSINESS_LOGIC_ERROR("01" + CommonErrorCode.BUSINESS_LOGIC_ERROR.getCode(), CommonErrorCode.BUSINESS_LOGIC_ERROR.getMessage());

    private final String code;
    private final String message;

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

    public String getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}
  1. 编写错误码生成工具类
    在公共模块中编写错误码生成工具类,为各个服务提供生成错误码的方法,确保生成规则的一致性。
    错误码生成工具类
    // 公共模块中的错误码生成工具类
public class ErrorCodeGenerator {
    public static String generateErrorCode(String serviceId, String commonErrorCode) {
        return serviceId + commonErrorCode;
    }
}
  1. 建立错误码文档
    编写详细的错误码文档,记录所有公共错误码的含义、使用场景以及各个服务如何使用这些错误码。文档应保持更新,方便新成员查阅和理解。

2 框架提供公共的异常处理类,

业务异常 BizException,继承RuntimeException

public class BizException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    public BizException(String errMessage) {
        super(DEFAULT_ERR_CODE, errMessage);
    }

    public BizException(String errCode, String errMessage) {
        super(errCode, errMessage);
    }

    public BizException(String errMessage, Throwable e) {
        super(DEFAULT_ERR_CODE, errMessage, e);
    }

    public BizException(String errorCode, String errMessage, Throwable e) {
        super(errorCode, errMessage, e);
    }

}

系统异常SystemException,继承RuntimeException

开发可以自定义异常处理类继承BizException,或者SystemException

容器异常处理拦截处理

解决什么问题? 解决没有捕捉的异常,或者
1 捕捉系统抛出异常, 需要转成 专用异常类

2 抛出其他系统异常,需要转SystemExcepiton

3 作为response的输入,给到前端

参考资料

posted @ 2025-05-27 17:05  向着朝阳  阅读(39)  评论(0)    收藏  举报