NOTE

3.17 如何设计错误系统

错误系统设计的历史学习笔记,覆盖错误分类、错误码、上下文、传播、日志记录与对外错误信息处理。

系统设计创建于 更新于 约 1 分钟读完historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 什么是错误

程序运行过程中发生的异常问题

2. 错误分类

按照严重程度可以分为两类:严重与普通 严重的应该终止程序。比如程序启动时初始化资源失败等情况 普通的是情况而定

3. 错误构建

创建一个错误需要带上详细信息,如下

3.1. 错误码

错误码可以按错误来源或处理方式划分,例如:

  • 成功
  • 未知异常
  • 客户端或参数异常
  • 上游依赖异常
  • 基础设施或中间件异常
  • 数据异常

具体数值区间由系统自行约定。

3.2. 参数

3.3. 结果

参数是什么,结果是什么

3.4. 错误原因

4. 错误处理

  1. 继续往外抛出
  2. 捕获处理
    1. 添加额外信息
    2. 打印错误

5. 错误与调用方

错误信息有些不能暴露给调用方,需要屏蔽掉

6. 实例

下面使用与具体语言、框架和业务无关的伪代码表示核心思路:

function build_error(code, message, context, cause = null):
    error = Error(code, message)
    error.context = context
    error.cause = cause
    return error

function handle_error(context, error):
    log_error(context, error)

    public_error = sanitize_error(error)
    return public_error.code, public_error.message
  • 创建错误时保留错误码、消息、上下文和原始原因。
  • 已有底层错误时进行包装,而不是丢失原始错误链。
  • 日志记录内部诊断信息。
  • 返回给调用方之前进行脱敏,只暴露稳定、必要的错误码和消息。

7. 参考

关于错误码的那点事 - 知乎 在API程序设计开发中错误码如何规划设计? - 知乎 Go错误处理最佳实践 - Mohuishou

讨论

使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看