阿里妹导读:对于错误码的设计,不同的开发团队有不同的风格习惯。本文分享阿里文娱技术专家长统对于错误码的看法,希望从错误码使用的不同场景讨论得到一个合理的错误码规约,得到一个面向日志错误码标准和一个面向外部传递的错误码标准。
文末福利:抽奖送签名版《Java 开发手册》。
服务内传递,最终是输出到日志。
域内服务间,比如同时大麦电商之间的系统,最终目的是输出到日志。
域内向域外
服务端传递到前端
OpenAPI 错误码
内部不同域之间
通过错误码配置监控大盘。
通过日志进行问题排查,快速定位问题。
后端服务之间错误码传递。
前端展示的错误提示/OpenAPI。
好的错误码必须能够快速知晓错误来源。
好的错误码必须易于记忆和对比。
好的错误码必须能够脱离文档和系统平台达到线下轻量沟通的目的(这个要求比较高)。
错误码的制定原则:快速溯源、简单易记、沟通标准化。 说明:错误码想得过于完美和复杂,就像康熙字典中的生僻字一样,用词似乎精准,但是字典不容易随身携带并且简单易懂。 正例:错误码回答的问题是谁的错?错在哪? 1)错误码必须能够快速知晓错误来源,可快速判断是谁的问题。 2)错误码易于记忆和比对(代码中容易 equals)。 3)错误码能够脱离文档和系统平台达到线下轻量化地自由沟通的目的。
错误码即人性,感性认知+口口相传,使用纯数字来进行错误码编排不利于感性记忆和分类。 说明:数字是一个整体,每位数字的地位和含义是相同的。 反例:一个五位数字 12345,第1位是错误等级,第 2 位是错误来源,345 是编号,人的大脑不会主动地分辨每位数字的不同含义。
对于使用汉语的我们用英语去准确描述一个错误有时是比较困难的。
纯英文字母的错误码不利于排序。
错误码尽量有利于不同文化背景的开发者进行交流与代码协作。 说明:英文单词形式的错误码不利于非英语母语国家(如阿拉伯语、希伯来语、俄罗斯语等)之间的开发者互相协作。
首先要有一套标准并且在域内各个业务都在用同样的标准。
其次要求错误码有自我解释的能力是有信息含量的有意义。
最后在域内要传递错误码。
用来快速溯源找到问题。
用来形成监控大盘。
错误码不体现版本号和错误等级信息。 说明:错误码以不断追加的方式进行兼容。错误等级由日志和错误码本身的释义来决定。
错误码为字符串类型,共 5 位,分成两个部分:错误产生来源+四位数字编号。
错误码不能直接输出给用户作为提示信息使用。 说明:堆栈(stack_trace)、错误信息(error_message)、错误码(error_code)、提示信息(user_tip)是一个有效关联并互相转义的和谐整体,但是请勿互相越俎代庖。
在获取第三方服务错误码时,向上抛出允许本系统转义,由 C 转为 B,并且在错误信息上带上原有的第三方错误码。 结合错误码设计原则、错误码用途、规约建议,面向服务端日志的错误码应该是如下形式。
错误码分为一级宏观错误码、二级宏观错误码、三级宏观错误码。
错误码即人性,感性认知+口口相传,使用纯数字来进行错误码编排不利于感性记忆和分类。 说明:数字是一个整体,每位数字的地位和含义是相同的。 反例:一个五位数字 12345,第 1 位是错误等级,第 2 位是错误来源,345 是编号,人的大脑不会主动地分辨每位数字的不同含义。
应用标识,表示错误属于哪个应用,三位数字。
功能域标识,表示错误属于应用中的哪个功能模块,三位数字。
错误类型,表示错误属于那种类型,一位字母。
错误编码,错误类型下的具体错误,三位数字。
错误码为字符串类型,共 5 位,分成两个部分:错误产生来源+四位数字编号。 说明:错误产生来源分为 A/B/C,A 表示错误来源于用户,比如参数错误,用户安装版本过低,用户支付超时等问题;B 表示错误来源于当前系统,往往是业务逻辑出错,或程序健壮性差等问题;C 表示错误来源于第三方服务,比如 CDN 服务出错,消息投递超时等问题;四位数字编号从 0001 到 9999,大类之间的步长间距预留 100。
错误类型,表示错误来源,一位字母。
错误编码,表示具体错误,四位数字。
错误码的后三位编号与 HTTP 状态码没有任何关系。
错误码即人性,感性认知+口口相传,使用纯数字来进行错误码编排不利于感性记忆和分类。 说明:数字是一个整体,每位数字的地位和含义是相同的。 反例:一个五位数字 12345,第1位是错误等级,第 2 位是错误来源,345 是编号,人的大脑不会主动地分辨每位数字的不同含义。
全部正常,但不得不填充错误码时返回五个零:00000。
参考 《阿里巴巴java开发手册》 《Google API Design Guide 》(https://www.bookstack.cn/books/API-design-guide) 《阿里云-文件存储-错误码》(https://help.aliyun.com/document_detail/62603.html) 《微博开放平台-API-错误码》(https://open.weibo.com/wiki/Help/error) 《腾讯开放平台-错误码》(https://wiki.open.qq.com/wiki/%E9%94%99%E8%AF%AF%E7%A0%81)
福利来了
抽奖送 3 本《Java 开发手册》
在最新发布的《Java 开发手册(泰山版)》中,第一次提出完整的错误码规则解决方案,识别下方二维码加「阿里妹」好友,回复 “抽奖”,阿里妹将抽奖送出 3 本孤尽签名版《Java 开发手册》,同时还可领取超全学习资料及电子版手册~