错误码设计背景
原因:通过日志快速发现系统异常、定位异常发生地方
设计:长度 含义(域外含义、域内含义)
关联:错误码监控特定业务域报警
错误码设计规范(java开发手册)
错误码规范(公司内部规范)
前提:各个域都需要遵守规范
设计: 如何设计一套规范让各个业务方接入成本更低 设计一套通用父类,三方实现父类接口 按照约定规范设计错误码即可
含义:系统异常 、业务异常
拓展:系统异常可以考虑使用aspectj切面实现 配合监控实现告警
防重:(1)统一存储层设计 (2)前置内部模块,应用定义
具体实现: 采用int定义errorCode 模块+错误码
也有部分公司采用 项目编码+模块编码+错误编号
两种方式取决于公司内部系统实现,在全链路搜索背景下,公司内部基本对自己维护应用了解,jira处理中针对项目再划分编码意义不大。
通用模型构建:
为了保证规范可持续,可构建通用错误码申请平台,提供通用SDK进行业务自定义实现,具体实现方式在Java中常用是接口。
public interface IErrors {
Integer getCode();
String getMessage();
String getSolution();
}
public class Errors implements IErrors {
private Integer code;
private String message;
private String solution;
/********************************
* 保留的基本异常 1 #
*********************************/
public static final Errors DEFAULT_ERROR
= new Errors(1xxxxxxx, "{0}", "");
/********************************
* 业务校验异常 2 #
*********************************/
public static final Errors DEFAULT_BIZ_ERROR
= new Errors(1xxxxxxx, "{0}", "");
/********************************
* 业务校验异常-基础消费保障相关 #
*********************************/
/********************************
* 业务校验异常-库存 #
*********************************/
}
错误日志打印:
针对异常通常采用全局切面拦截,匹配异常类型实现特定异常处理,在切面中可以定义异常打印工具类,具体实现方式为 继承RuntimeException 按 应用 -> 模块 分别实现不同的异常。
异常思考
在日常业务开发中,对于异常使用最多的还是抛出Java异常(Exception),异常又分为受检查异常(Exception)和不受检查异常(RuntimeException):
- 受检查的异常:这种在编译时被强制检查的异常称为"受检查的异常"。即在方法的声明中声明的异常。
- 不受检查的异常:在方法的声明中没有声明,但在方法的运行过程中发生的各种异常被称为"不被检查的异常"。这种异常是错误,会被自动捕获。
- 异常绑定错误码 针对运行时异常与错误码进行绑定,在全链路排查问题时可以通过异常码快速定位问题。
public class BusinessBizException extends BusinessException {
public BusinessBizException(int code, String msg) {
super(code, msg);
}
public BusinessBizException(int code, String msg, Exception e) {
super(code, msg, e);
}
public BusinessBizException(int code, String msgFormat, Object... replacement) {
super(code, msgFormat,replacement);
}
public BusinessBizException(Errors defaultDependencyError, String msg) {
super(defaultDependencyError.getCode(), msg);
}
public BusinessBizException(String message) {
super(message);
}
public BusinessBizException(Errors errors) {
this(errors.getCode(), errors.getMessage());
}
}
- 接口返回值是异常还是Result 包装类 可以参考谈谈Java接口Result设计 这篇技术博客 贴一段具体文字
总结
总结了公司内部设计错误码的实现并且粘贴部分阅读资料,以上的错误码定义基本能满足一般中大型项目。规范有了最重要的还是落地,如果有能力可以打造统一的错误码定义平台,用平台使成员遵守规范,让项目健康的迭代。