国际化支持: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容错和性能上更好一些 。
- 程序员|中美俄程序员有什么不同?美当雇佣兵、俄当黑客,中国专心赚钱!
- 核能|“小透明”饿了么:是否还能逆风翻盘?
- 美团|第三次电商革命来了,引领者可能是美团
- 软件|买Apple watch还是机械表?
- 苹果|俄罗斯的苹果设备被禁止使用了?消息是假的,均可以正常使用
- 华硕|给爸妈换手机,是换旧iPhone,还是新国产机?有什么差别?
- 江苏省|广东有格力、华为、中兴,江苏有什么?
- 机器人|特斯拉又又又涨价 等等党吐槽“还是骑共享单车吧”
- 工业互联网|买Apple watch还是机械表?
- 荣耀|小屏手机少人问津?荣耀大屏也是如此,并且价格已跌破两千元大关