繁体   English   中英

为什么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()); }

通过向记录器提供异常类,将堆栈跟踪写入日志。

我们的代码库中的问题是:通过遵循Tell,不要求原则,我们使用checked checked作为我们考虑的,正常执行路径的一部分,我们不希望它们导致不合理的大型日志消息。

举几个例子:服务器响应错误代码,数据库语句执行失败,乐观锁定(并发用户)......

我的建议:把这个案子分成两部分。

// 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的,那么您应该考虑关闭规则,或将其从项目文件中排除

但要回答你的问题:

异常记录的目的是为调查人员留出足够的信息来找出问题的原因。

如果您的消息是详细的,例如

y方法中的x因为frabjous不够白而破了

那么也许他们实现了这个目的。 但是像这样的消息呢?

有些不对劲

此外, 确切地知道每个异常消息的含义,但总有一天您可能会转向更大更好的事情。 下一个支持该系统的人是否具有相同的知识深度? 可能会感谢堆栈跟踪和行号,告诉他从哪里开始寻找......

但最后,我不得不问:你为什么要记录如此多的例外情况,以便淹没记录器?

我理解维护堆栈跟踪的论据以及所有这些,但我认为它会使日志膨胀为<ERROR级别事件。 一种解决方案是将消息记录为WARN,并将异常对象记录为DEBUG或TRACE。 这样,普通的用户日志配置不会像通常的堆栈跟踪一样泛滥,但如果需要,仍然可以获得堆栈跟踪。

(添加另一个答案来解决重写的问题:)

为什么要同时处理异常记录它? 如果处理了,就没有理由记录。

尝试将整个对象传递给方法而不仅仅是e.getMessage() LOGGER.info("INFO "e.);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM