我的Java代码中的关键SonarLint问题S1166是否为假阳性?

我的Java代码中的关键SonarLint问题S1166是否为假阳性?,java,sonarlint,Java,Sonarlint,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 voi

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);
        }
    }

    [...]
以下是匹配的摘录:

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

不遵从代码示例 //不符合-异常丢失 尝试{/*…*/}catch(异常e){LOGGER.info(“context”);} //不符合-异常丢失(仅保留消息) 尝试{/*…*/}catch(异常e){LOGGER.info(e.getMessage());} //不符合-异常丢失 尝试{/*…*/}catch(异常e){throw new RuntimeException(“context”);} 兼容解决方案 尝试{/*…*/}catch(异常e){LOGGER.info(e);} 尝试{/*…*/}catch(异常e){抛出新的RuntimeException(e);} 尝试{/*…*/}捕获(运行时异常e){ doSomething(); 投掷e; }捕获(例外e){ //也允许转换为未检查的异常 抛出新的运行时异常(e); } 在我看来,我的代码符合给定兼容解决方案的第一个变体,但SonarLint不接受它

有一段时间以前,但它不是真的关于同一个问题,我有


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

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


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

您使用的是什么日志框架?也许SonarLint不知道你的框架。谢谢你的回复hinneLinks,我使用log4j。我还修改了原始问题以包含此信息。不直接相关,但我想知道Sonar是否发现
LOGGER.error(e)
可接受,因为
LOGGER.info(e)
符合要求。您好,我试过了。无论我使用
LOGGER.info(e)
还是
LOGGER.error(e)
,都没有区别。我认为期望对log4j的支持并不是不合理的。但在任何情况下,如果它不能声称“无所不知”,那么代码只做一些例外就足够了——它怎么知道其他情况呢? // 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); }