除了向用户显示之外,用户异常(例如:“登录用户名已存在”)要么单独存在,要么根本不存在(“用户未通过身份验证”)。技术异常(例如:“没有足够的文件存储来订阅此产品”)是您需要调试和响应的内容,如果您记录所有内容,则很有可能日志实体太长而无法真正有意义地反映到您的异常日志中。您应该查看日志文件中的每个异常以查找其原因(“它是一个错误”)记录日志的时候不要抛出异常,太多的异常会让您对异常马虎(“嗯,这只是一个正常的异常”)。
2、将数据存储在异常中以便于记录
“无法向帐户收费”异常您应该存储异常的上下文,就像 Junit 所做的那样(“预期......但得到......”)以便于调试。子句 CannotChargeMoneyAccountExceptionMoney(moneyInAccount, Money toCharge, Account account) 可以读作:“尝试向帐户 1234567890 收取 20 欧元,但只有 10 欧元可用”与“扣除失败”相比记录日志的时候不要抛出异常,这使得以后更容易以有意义的方式记录异常.
3、记录异常的描述
来自 Sun 的错误示例:ClassCastException 没有显示您要转换的类。现在你甚至可以找到:
1
2
finalString s = "你好";
finalint x = (Integer) s;
它在编译时告诉你:
T.java:4:不可转换的类型
找到:java.lang.String
必需:java.lang.Integer
最终整数 x = (整数) s;
Java 在运行时抛出的异常
线程“主”java.lang.ClassCastException 中的异常:
java.lang.String 不能转换为 java.lang.Integer
这个比以前好看
4、输出异常原因
如果异常周围有一个包装器作为异常的原因,则记录所有原因。有些日志框架已经为您执行此操作,有些则没有,因此请确保所有异常原因都记录在日志文件中,并且所有相关堆栈跟踪的开头都记录在您的文件中,而不是杂乱无章。
5、选择合理的日志级别
如果您的异常是关键的,请将其记录为 Level.CRITICAL,如果您需要确定关键对您意味着什么(通常是金钱损失),例如如果一个预定的功能失败,或者用户因为技术问题不能注册,那么你就有一个关键问题需要解决。监视日志文件中的关键异常,因为您正在遭受损失。让您自己的异常实现 isCritical() 或 CRITICALException 接口,将异常记录到具有包装类和正确日志级别的文件中。如果您的日志框架找不到合理的级别,请创建它。
6、不录再扔
在记录后重新抛出异常是异常的反模式。
1
2
3
4
catch(NoUserException e) {
LOG.error("否
用户可用",
e);
thrownew UserServiceException("Nouseravailable",
e);
}
不要这样做,您的日志文件在堆栈级别多次包含相同的异常,请记住只记录一次。
7、不要使用 System.out 或 System.err 记录
使用日志框架,它可以比你处理得更好
希望这些规则能在处理异常日志时对您有所帮助,并使调试更容易。
英文原文:Codemonkeyism,编译:ImportNew - 刘志军
翻译链接: