7

SonarLint 1.0.0 for Eclipse 在我的代码中标记了一个关键问题,我不知道为什么以及如何解决它。对我来说,这真的像是一个误报——或者我错过了什么?

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

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

不合规代码示例

// 不合规 - 异常丢失
尝试 { /* ... */ } catch (Exception e) { LOGGER.info("context"); }   

// 不合规 - 异常丢失(仅保留消息)       
尝试 { /* ... */ } catch (Exception e) { LOGGER.info(e.getMessage()); }

// 不合规 - 异常丢失
try { /* ... */ } catch (Exception e) { throw new RuntimeException("context"); }

合规解决方案

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

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

尝试 { /* ... */ } 捕捉 (RuntimeException e) {
    做一点事();  
    扔 e;
} 捕捉(异常 e){
    // 也允许转换为未经检查的异常
    抛出新的 RuntimeException(e);
}

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

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

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

4

1 回答 1

3

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

可能是该规则没有对 Log4j 的具体了解,但缺乏对所有日志库的无所不知,将异常作为参数传递的事实就足够了。

于 2015-12-01T17:15:37.070 回答