我的Java代码中的关键SonarLint问题S1166是否为假阳性?
SonarLint 1.0.0 for Eclipse在我的代码中标记了一个关键问题,我不知道为什么以及如何修复它。对我来说,这真的像是假阳性,还是我遗漏了什么我的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
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);
}