我的 Java 代码中的关键 SonarLint 问题 S1166 是否为误报?
Is critical SonarLint issue S1166 in my Java code a false positive or not?
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 rule description 的摘录:
When handling a caught exception, the original exception's message and
stack trace should be logged or passed forward.
Noncompliant Code Example
// 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"); }
Compliant Solution
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 不接受它。
不久前,但这不是我遇到的同一个问题。
编辑: 回答以下问题:我使用 log4j 进行日志记录。我扩展了代码以反映这一点。
实际上,您正在记录原始异常的消息和堆栈跟踪;这是一个错误的发现。
可能是规则对Log4j没有具体的了解,但是对所有的日志库都缺乏了解,把异常作为参数传递就够了。
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 rule description 的摘录:
When handling a caught exception, the original exception's message and stack trace should be logged or passed forward.
Noncompliant Code Example
// 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"); }Compliant Solution
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 不接受它。
不久前
编辑: 回答以下问题:我使用 log4j 进行日志记录。我扩展了代码以反映这一点。
实际上,您正在记录原始异常的消息和堆栈跟踪;这是一个错误的发现。
可能是规则对Log4j没有具体的了解,但是对所有的日志库都缺乏了解,把异常作为参数传递就够了。