为什么 squid:S1166 仅在记录捕获的异常时不接受异常消息?
Why does squid:S1166 not accept exception messages only when logging caught exceptions?
引用规则描述(SonarQube 4.5.5):
// Noncompliant - exception is lost (only message is preserved)
try { /* ... */ }
catch (Exception e) { LOGGER.info(e.getMessage()); }
通过向记录器提供异常 class,堆栈跟踪将写入日志。
我们代码库中的问题是这样的:
通过遵循 Tell, don't ask 原则,我们使用检查异常作为正常执行路径的一部分,我们不希望它们导致不合理的大日志消息。
几个例子:服务器响应错误代码,数据库语句执行失败乐观锁定(并发用户)...
我的建议:把这个案例一分为二。
// Noncompliant - exception is lost (only message is preserved)
try { /* ... */ }
catch (Exception e) { LOGGER.info(e.getMessage()); }
和
// Compliant - exception is lost (only message is preserved) but there is business logic handling the situation
try {
/* ... */
} catch (Exception e) {
LOGGER.info(e.getMessage());
*/ exception handling */
}
规则 squid:S00108(代码块不能为空)不会捕获问题,因为存在日志语句。
这不合理吗?我错过了什么重要的事情吗?
注意:我重写了问题以阐明我的用例
如果它导致数百次您认为是 FP 的情况,那么您应该考虑关闭该规则,或者 excluding it from your project files。
但是要回答你的问题:
异常记录的目的是为调查人员留下足够的信息来找出问题的原因。
如果您的消息很详细,例如
The x in the y method broke because the frabjous was not day enough
那么也许他们实现了这个目的。但是像
这样的消息呢?
Something went wrong
?
此外,您 确切地知道每个异常消息的含义,但总有一天您可能会转向更大更好的事情。下一个支持该系统的人会有同样的知识深度吗? 他 可能会感谢告诉他从哪里开始查找的堆栈跟踪和行号...
但最后,我不得不问:为什么你得到并记录了如此多的异常,以至于你淹没了记录器?
(添加另一个答案来解决重写的问题:)
为什么你们都处理异常 并且 记录它?如果处理好了,就没有理由记录了。
我理解维护堆栈跟踪和所有这些的论点,但我认为它会使您的日志因 < ERROR 级别的事件而膨胀。一种解决方案是将消息记录为 WARN,并将异常对象记录为 DEBUG 或 TRACE。这样,普通用户日志配置就不会像往常一样被堆栈跟踪淹没,但如果需要,仍然可以获得堆栈跟踪。
尝试将整个对象传递给方法,而不仅仅是 e.getMessage()LOGGER.info("INFO "e.);
引用规则描述(SonarQube 4.5.5):
// Noncompliant - exception is lost (only message is preserved)
try { /* ... */ }
catch (Exception e) { LOGGER.info(e.getMessage()); }
通过向记录器提供异常 class,堆栈跟踪将写入日志。
我们代码库中的问题是这样的: 通过遵循 Tell, don't ask 原则,我们使用检查异常作为正常执行路径的一部分,我们不希望它们导致不合理的大日志消息。
几个例子:服务器响应错误代码,数据库语句执行失败乐观锁定(并发用户)...
我的建议:把这个案例一分为二。
// Noncompliant - exception is lost (only message is preserved)
try { /* ... */ }
catch (Exception e) { LOGGER.info(e.getMessage()); }
和
// Compliant - exception is lost (only message is preserved) but there is business logic handling the situation
try {
/* ... */
} catch (Exception e) {
LOGGER.info(e.getMessage());
*/ exception handling */
}
规则 squid:S00108(代码块不能为空)不会捕获问题,因为存在日志语句。
这不合理吗?我错过了什么重要的事情吗?
注意:我重写了问题以阐明我的用例
如果它导致数百次您认为是 FP 的情况,那么您应该考虑关闭该规则,或者 excluding it from your project files。
但是要回答你的问题:
异常记录的目的是为调查人员留下足够的信息来找出问题的原因。
如果您的消息很详细,例如
The x in the y method broke because the frabjous was not day enough
那么也许他们实现了这个目的。但是像
这样的消息呢?Something went wrong
?
此外,您 确切地知道每个异常消息的含义,但总有一天您可能会转向更大更好的事情。下一个支持该系统的人会有同样的知识深度吗? 他 可能会感谢告诉他从哪里开始查找的堆栈跟踪和行号...
但最后,我不得不问:为什么你得到并记录了如此多的异常,以至于你淹没了记录器?
(添加另一个答案来解决重写的问题:)
为什么你们都处理异常 并且 记录它?如果处理好了,就没有理由记录了。
我理解维护堆栈跟踪和所有这些的论点,但我认为它会使您的日志因 < ERROR 级别的事件而膨胀。一种解决方案是将消息记录为 WARN,并将异常对象记录为 DEBUG 或 TRACE。这样,普通用户日志配置就不会像往常一样被堆栈跟踪淹没,但如果需要,仍然可以获得堆栈跟踪。
尝试将整个对象传递给方法,而不仅仅是 e.getMessage()LOGGER.info("INFO "e.);