java – 为什么squid:S1166只在记录捕获的异常时才接受异常消息?

引用规则的描述(SonarQube 4.5.5):

// Noncompliant - exception is lost (only message is preserved)   
try { /* ... */ } 
catch (Exception e) { LOGGER.info(e.getMessage()); }

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

我们的代码库中的问题是:
遵循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(代码块不能为空)不会捕获问题,因为有一个日志记录语句.

这不合理吗?我错过了一些重要的东西吗?

注意:我已经重写了这个问题以澄清我的用例

解决方法:

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

上一篇:后台代码扫描规则-sonarQube官方


下一篇:java – 声纳上的声纳误报:不应该取消引用空指针