【问题标题】:Is critical SonarLint issue S1166 in my Java code a false positive or not?我的 Java 代码中的关键 SonarLint 问题 S1166 是否为误报?
【发布时间】:2016-03-05 06:05:57
【问题描述】:

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的摘录:

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

不合规代码示例

// 不合规 - 异常丢失 尝试 { /* ... */ } 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 不接受它。

不久前有another discussion of Sonar rule S1166,但这与我遇到的问题不同。

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

【问题讨论】:

  • 您使用的是什么日志记录框架?也许 SonarLint 不知道你的框架。
  • 感谢您的回复 hinneLinks,我使用 log4j。我还修改了原始问题以包含此信息。
  • 不直接相关,但我想知道 Sonar 是否认为 LOGGER.error(e) 可以接受,因为 LOGGER.info(e) 是合规的。
  • 嗨悲惨变量,我试过了。我使用LOGGER.info(e) 还是LOGGER.error(e) 没有区别。

标签: java sonarlint


【解决方案1】:

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

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

【讨论】:

  • 我认为期待对 log4j 的支持并非不合理。但在任何情况下,如果它不能声称“全知”,那么代码做 something 例外就足够了——它怎么能知道其他情况呢?
猜你喜欢
  • 2016-07-02
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
相关资源
最近更新 更多