Skip to content

错误处理与请求追踪

错误不是一个统一的“500”。输入不合法、没有权限、资源不存在、依赖超时和程序异常需要不同处理。稳定的错误模型能让客户端做正确分支,也能让服务端更快定位。

先按责任划分失败

失败类型例子应如何响应
输入问题缺少必填字段、格式错误指出可修正字段
身份与权限未登录、越权操作明确认证或权限状态
资源状态不存在、版本冲突告知资源现状或刷新方式
依赖故障数据库、第三方服务超时记录上下文,提供重试语义
程序异常未预料分支、代码缺陷避免泄露细节,关联请求标识

服务端内部堆栈和密钥不能直接返回给客户端。对外给出可操作的信息,对内记录排查所需的上下文。

使用稳定的错误体

json
{
  "code": "VALIDATION_ERROR",
  "message": "请检查提交内容",
  "fields": {
    "title": "标题不能为空"
  },
  "requestId": "req_abc123"
}

code 给程序判断,message 给用户阅读,fields 支持表单定位,requestId 让支持人员和日志系统能指向同一次请求。字段缺失时应保持兼容,不要让客户端必须猜测。

请求标识贯穿调用链

入口处生成或接收请求标识,并传到日志、下游调用和错误响应中。一次页面失败时,开发人员可以从标识找到所有相关记录,而不是在海量日志中按时间猜测。

text
请求 req_abc123
  → API 日志:解析参数
  → 服务日志:创建订单
  → 数据库日志:事务回滚
  → 响应:requestId=req_abc123

处理失败不等于无限重试

重试应有次数、退避与总时限;写入操作还要有幂等键或去重策略。无法自动恢复的失败应进入清晰的人工处理或补偿流程。

  • 记录发生了什么、影响谁、是否可重试。
  • 对预期业务错误降低日志噪音,对异常错误保留足够上下文。
  • 定期回顾高频错误,把重复人工处理变成产品提示或代码约束。

为复用而记录,为理解而整理。