Java|什么是好的错误消息?讨论一下Java系统中的错误码设计( 二 )


还记得前面说的error的context吗?这里error code其实就是启动context的作用 , 如 UIC-LOGIN-404 , 错误发生在哪里?错误码帮你定位啦 。 当时代码想干什么?错误码也说明啦 。 虽然说错误码不能完全代表错误的上下文 , 但是其承载的信息已经足够我们帮我们了解当时的上下文啦 , 所以这里error code就是起着context的作用 。 目前看来至少error code要比 ProblemBuilder.newBuilder(TestProblemId.ERROR1 StandardSeverity.ERROR \"Hawaiian pizza\") 中的Hawaiian pizza 作为context更具有说服力 , 也规范一些 。
三 错误消息的编写格式 错误码设计完毕后 , 我们还不能用错误码+简短消息方式输出错误 , 不然就出现类似 ORA-00942: table or view does not exist这种情况 , 你一定会吐槽:\"你为何不告诉哪个表或者view?\" 。 所以我们还需要设计一个message格式 , 能够将错误的context description reason document link solutions全部包含进来 , 这样对开发者会比较友好 。 这里我拟定了一个Message的规范 , 当然大家可以发表自己的意见啊 , 如下:
long description(short desc): because/reason --- document link -- solutions 解释一下:
错误的长描述直接书写 , 短描述使用括弧进行包含 。 这种写法在合同中非常常见 , 如阿里云计算有限公司(阿里云), 你签署劳动合同时 , 公司的称谓基本也是全名(代称) 这种方式 。 好多同学会在错误日志中书写登录失败 , 但是登录系统中有多种登录方式 , 所以远不如Failed to log in with email and password(Login Failed) Failed to log in with phone and passcode(Login Failed) Failed to log in with oauth2(Login Failed) 更清晰 。错误具体原因: 接下来是冒号 , 然后书写详细的原因 , 如 email user@example.com not found, gender field is not allowed in package.json 一定要包含具体的数据信息 , 包括输入的 , 还是和劳动合同一样 , 抬头之后就是你的具体岗位和薪水 , 虽然合同是格式化的 , 但是每一个人具体的岗位和薪水是不同的 , 这些参数都是从外部获取的 。 此处有安全同学发问 , 如何数据脱敏?这个是另外的问题 , 大多数开发者应该了解如何进行mask , 这里我们就跳过 。 当出现劳动纠纷这个错误时 , 具体原因中的数据 , 如岗位和薪水等 , 这样劳动仲裁局就可以快速定位并解决该\"错误\" 。document link: 接下来我们使用三种划线---进行分隔 , 输入对应的error link 。 三划线作为分隔符在很多的场景中多有使用 , 如mdx yaml等 , 大家不会太陌生 。如果没有link那就忽略就可以 。solutions:自然的文本表述即可 , 能说明清楚就可以 , 也是放在三中划线后 。看一个具体的消息格式例子:
APP-100-400=Failed to log in system with email and password(Email login failed): can not find account with email { --- please refer https://example.com/login/byemail --- Solutions: 1. check your email 2. check your password 上述的APP-100-400的错误码对应的描述基本覆盖到jdoctor中需要的信息 , 可以说对一个错误的描述应该非常全啦 , 而且有一定的格式 , 也方便后续的日志分析 。
四 组装和保存错误码 + Message 有了错误码和message的规范 , 接下来我们应该如何保存这些信息呢?如果是Java , 是不是要创建对应的ErrorEnum , 然后是一些POJO?这里个人建议使用properties文件来保存错误码和message的信息 。 文件名可以直接为ErrorMessages.properties , 当然是在某一package下 , 文件样例如下:
### error messages for your AppAPP-100-400=Failed to log in system with email and password(Email login failed): can not find account with email {0 --- please refer https://example.com/login/byemail --- Solutions: 1. check your email 2. check your passwordAPP-100-401=Failed to log in system with phone and pass(Phone login failed): can not find account with phone {0 --- please refer https://example.com/login/byphone --- Solutions: 1. check your phone 2. check your pass code in SMS 为何要选择properties文件来保存error code和message信息 , 主要有以下几个原因: