2023年11月29日发(作者:)

统⼀异常处理+错误编码设计⽅案

⼀、背景

1、系统在运⾏的时候可能会有下⾯这些种类的错误/失败发⽣:

(1) 依赖组件挂了,可能是 db,可能是 mq,可能是 cache。

在程序中使⽤枚举对错误编码进⾏存储。

3、如何获取

1)系统bug级别的:直接在枚举中查看错误信息

2)⾮系统bug级别的:设计单独的接⼝获取错误信息

综上所述:为了很好的扩展功能,建议设计单独的接⼝获取错误信息

4、具体编码设计

第1位(固定,⽤x标识,没有特殊设计含义,只是为了⽅便存储)

第2位(错误级别,1为⾮系统bug,2为系统bug需要改代码)

第3-4位(功能模块)

第5-8位(错误编码,从0001开始,依次顺延)

实例:x1010001

五、开发规范(在代码中使⽤“抛异常”还是“返回错误码”)

1、对于公司外的 http/api 开放接⼝必须使⽤错误码;⽽应⽤内部推荐异常抛出。

2、跨应⽤间 RPC 调⽤,优先考虑使⽤ Result ⽅式,封装 isSuccess()⽅法、错误码错误简短信息

1)关于 RPC ⽅法返回⽅式使⽤ Result ⽅式的理由

使⽤抛异常返回⽅式,调⽤⽅如果没有捕获到就会产⽣运⾏时错误。

如果不加栈信息,只是 new ⾃定义异常,加⼊⾃⼰的理解的 error message,对于调⽤端解决问题的帮助不会太多。

如果加了栈信息,在频繁调⽤出错的情况下,数据序列化和传输的性能损耗也是问题。

2)具体实现

统⼀返回结果展⽰,定义Result,封装 isSuccess()⽅法、“错误码”、“错误信息”。并提供ResultUtil⼯具类⽅便使⽤。

public class Result implements Serializable {

public class ResultUtil {

public class CommonException extends RuntimeException{

@ControllerAdvice