国际化支持:Java的同学都知道 , 如果你的错误消息想调整为中文 , 创建一个ErrorMessages-zh_CN.properties 即可 。 原文中的建议是Don’t localize error messages , 但是考虑到国内大多数程序员未必能用英文表达清楚 , 所以中文也是可以的 。 题外话:如果中国的程序员都能用英文清晰地阅读文章和表达自己的思想和观点 , 我们在计算机方面的水平可能会提升到更高的台阶 。各种语言对properties的文件解析都有支持 , 不只是Java , 其他语言也有 , 而且properties文件本身也不复杂 , 所以该properties文件可以给Node.js Rust等其他语言使用 , 如果是Java enum和POJO基本就不可能啦 。properties文件格式丰富:支持注释 , 换行符 , 多行转义等也都没有问题 。
最后最关键的是IDE支持非常友好以Java开发者使用的IntelliJ IDEA来说 , 对Properties文件的支持可以说是到了极致 , 如下:
error code的自动提示 【Java|什么是好的错误消息?讨论一下Java系统中的错误码设计】
快速查看:鼠标移上去就可以 , 按下CMD鼠标移上去也可以 ,Alt+Space也可以 , 当然点击直接定位就更不用说啦 。
重构和查找支持:虽然Error Code是字符串 , 但是也是properties的key , 所以rename这个error code , 所有引用的地方都会rename 。 还支持find usage , 那些地方引用了该error code等 , 都非常方便 。 当然如果Error Code在系统中没有被使用 , 也会灰色标识 。折叠自动显示功能:当你的代码处于折叠状态时 , IDEA直接将message拿过来进行显示 , 你在code review的时候方便多啦 , 也便于你理解代码 。
直接修改message的值
总之IntellIJ IDEA对properties文件的支持到了极致 , 我们也没有理由不考虑开发者体验的问题 , 到处跳来跳去地找错误码 , 这种伤害程序员开发体验的事情不能做 。当然JetBrains的其他IDE , WebStorm等都有对proproperties文件编辑支持 。
五 代码实现 看起来功能挺酷炫的 , 是不是这种方式错误管理要介入一个开发包啊?不需要 , 你只需要10行代码就搞定 , 如下:
import org.slf4j.helpers.MessageFormatter;public class AppErrorMessages { private static final String BUNDLE_FQN = \"app.ErrorMessages\"; private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_FQN new Locale(\"en\" \"US\")); public static String message(@PropertyKey(resourceBundle = BUNDLE_FQN) String key Object... params) { if (RESOURCE_BUNDLE.containsKey(key)) { String value = https://mparticle.uc.cn/api/RESOURCE_BUNDLE.getString(key); final FormattingTuple tuple = MessageFormatter.arrayFormat(value params); return key + /" - \" + tuple.getMessage();else { return MessageFormatter.arrayFormat(key params).getMessage();这样在任何地方如果你要打印错误消息的时候 , 这样log.info(AppErrorMessages.message(\"APP-100-400\"\"xxx\"));就可以 。 如果你还有想法和log进行一下Wrapper , 如 log.info(\"APP-100-400\"\"xxx\");, 也没有问题 , 样例代码如下:
public class ErrorCodeLogger implements Logger { private Logger delegate; private static final String BUNDLE_FQN = \"app.ErrorMessages\"; private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_FQN new Locale(\"en\" \"US\")); public ErrorCodeLogger(Logger delegate) { this.delegate = delegate;@Override public void trace(@PropertyKey(resourceBundle = BUNDLE_FQN) String msg) { delegate.trace(RESOURCE_BUNDLE.getString(msg));接下来你就可以在log中直接整合error code , 非常便捷 。 上述代码我已经写好 , 你参考文章末尾的项目地址即可 。
最终的日志输出如下:
提醒:这里我们使用了slf4j的MessageFormatter , 主要是方便后续的Slf4j的整合 , 而且slf4j的MessageFormatter比Java的MessageFormat容错和性能上更好一些 。
- ios16|未受到电商冲击,理发店为啥还是纷纷倒闭?过来人说出真相
- 有人觉得中暑就是热出来的,吃一些退烧药就好了,这种做法 蚂蚁庄园今日答案6月28日
- 浮甘瓜于清泉,沉朱李于寒水”描述的是什么场面 蚂蚁庄园今日答案6月28日
- 为验证人类和黑猩猩,是否会产生新的后代,科学家找来5位姑娘!
- 喜马拉雅山出现的“雪人”是何生物?目击者:智商高、攻击性强
- 为什么科学家表示人类“灭绝”的可能性极低?这些理由你赞同吗?
- 显卡|这就是RTX 4090 Ti显卡?又厚又重,超过三槽要1200W电源
- 为什么科学家知道太阳的原理,却无法制造出人造太阳
- 土耳其发现四肢爬行人群,这是咋回事?科学家警告:人类要留心了
- 图像传感器|到手1849元重量189g这才是高性价比的骁龙870直屏手机
