SonarLint在我的Java代码中发出S1166错误是否为假?

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规则描述的摘录:

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

不兼容的代码示例

// 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不接受它。

不久前还有一次关于Sonar规则S1166的讨论,但这与我所遇到的问题并不完全相同。

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


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

这可能是因为该规则并不具备Log4j的特定知识,但缺乏所有日志库的全部知识,事实上该异常作为参数传递就足够了。

链接地址: http://www.djcxy.com/p/30779.html

上一篇: Is critical SonarLint issue S1166 in my Java code a false positive or not?

下一篇: Patsy: New levels in categorical fields in test data