为什么需要错误码设计规范
写代码时,谁都免不了遇到问题。用户输入不对、网络断了、文件找不到,这些情况都得告诉调用方到底出了啥事。如果只甩一句“操作失败”,那排查起来就像盲人摸象。这时候,一套清晰的错误码设计就显得特别重要。
比如你开发一个支付接口,返回一个错误码 4001,附带说明“余额不足”。运维看到这个码,不用翻日志就能快速定位,前端也能根据它提示用户去充值。但如果错误码乱编,像今天是 4001,明天变成 5003 表示同一个问题,协作效率立马下降。
错误码的基本结构
常见的做法是采用分段数字编码。例如用 6 位整数,前两位代表系统模块,中间两位表示子服务,最后两位是具体错误类型。
100101 - 用户中心 | 登录模块 | 账号不存在
200203 - 订单系统 | 创建订单 | 库存不足
300104 - 支付服务 | 支付处理 | 余额不足这种结构化方式,一眼就能看出问题出在哪个环节。团队新人接手也容易理解,不需要每次都问“这个错误码是啥意思”。
命名与可读性
除了数字,也可以配合枚举名称使用。尤其在内部系统中,直接用英文常量更直观。
PAYMENT_FAILED_BALANCE_LOW = 300104
ORDER_CREATION_STOCK_INSUFFICIENT = 200203前后端联调时,看到这样的名字比纯数字友好得多。线上查问题时,日志里打印出 PAYMENT_FAILED_BALANCE_LOW,比一堆数字更容易联想场景。
避免常见坑
有些人图省事,直接复用 HTTP 状态码。比如 404 表示资源没找到,500 当万能兜底。但实际业务远比这复杂。用户被封禁和账号不存在,都可能归到 403,但处理方式完全不同。
另一个问题是动态拼接错误信息。比如“文件 xxx 不存在”,每次错误信息都不一样,导致无法按错误类型统计。应该把变量抽出来,错误码固定指向“文件不存在”,文件名单独传参。
配套文档不可少
再好的错误码,没人知道也白搭。建议维护一份共享表格或 Wiki 页面,列出所有错误码、含义、触发场景和建议操作。每次新增错误都要走评审,防止重复或歧义。
上线后的监控系统也可以按错误码聚合报警。比如发现 300104 突然飙升,马上就能意识到是支付环节出问题,而不是等用户投诉才反应过来。