在我的Java代码中,关键的SonarLint问题S1166是否是误报?

时间:2015-12-01 10:40:21

标签: java sonarlint

Eclipse的SonarLint 1.0.0标记了我的代码中的一个关键问题,我无法理解为什么以及如何解决它。这对我来说真的是假阳性 - 或者我错过了什么?

import org.apache.log4j.Logger;

[...]

public final class Foo {

    private static final Logger logger = Logger.getLogger(Foo.class);

    [...]

    public static void foo() {

        MyCommand command = new MyCommand(foo, bar);
        try {
            commandService.executeCommand(command);
        } catch (CommandException e) {
            logger.error("My command execution failed", e);
        }
    }

    [...]

以下是匹配SonarLint rule description的摘录:

  

处理捕获的异常时,原始异常的消息和   应记录或传递堆栈跟踪。

     

不符合规范的代码示例

// Noncompliant - exception is lost
try { /* ... */ } catch (Exception e) { LOGGER.info("context"); }   

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

// Noncompliant - exception is lost
try { /* ... */ } catch (Exception e) { throw new RuntimeException("context"); }
     

合规解决方案

try { /* ... */ } catch (Exception e) { LOGGER.info(e); }   

try { /* ... */ } catch (Exception e) { throw new RuntimeException(e); }

try {   /* ... */ } catch (RuntimeException e) {
    doSomething();  
    throw e;
} catch (Exception e) {
    // Conversion into unchecked exception is also allowed
    throw new RuntimeException(e);
}

在我看来,我的代码符合给定合规解决方案的第一个变体,但SonarLint不接受它。

不久前有another discussion of Sonar rule S1166,但实际上并不是我遇到的问题。

编辑:在回答以下问题时:我使用 log4j 进行记录。我扩展了代码以反映这一点。

1 个答案:

答案 0 :(得分:3)

实际上,您正在记录原始异常的消息和堆栈跟踪;这是一个错误的发现。

规则可能没有Log4j的特定知识,但缺乏所有日志库的全知性,异常作为参数传递的事实就足够了。