22

我的程序中有以下代码,在将其与 Maven 集成后,我正在运行 SonarQube 5 以对其进行代码质量检查。

但是,Sonar 抱怨我应该记录或重新抛出这个异常

我在这里想念什么?我还没有记录异常吗?

 private boolean authenticate(User user) {
        boolean validUser = false;
        int validUserCount = 0;
        try {
            DataSource dataSource = (DataSource) getServletContext().getAttribute("dataSource");
            validUserCount = new MasterDao(dataSource).getValidUserCount(user);
        } catch (SQLException sqle) {
            LOG.error("Exception while validating user credentials for user with username: " + user.getUsername() + " and pwd:" + user.getPwd());
            LOG.error(sqle.getMessage());
        }
        if (validUserCount == 1) {
            validUser = true;
        }
        return validUser;
    }
4

4 回答 4

40

你应该这样做:

try {
    DataSource dataSource = (DataSource) getServletContext().getAttribute("dataSource");
    validUserCount = new MasterDao(dataSource).getValidUserCount(user);
} catch (SQLException sqle) {
    LOG.error("Exception while validating user credentials for user with username: " +
            user.getUsername() + " and pwd:" + user.getPwd(), sqle);
}

声纳不应该再打扰你了

于 2015-04-16T09:02:15.407 回答
12

声纳要求你做的是持久化整个异常对象。你可以使用类似的东西:

    try {
        ...         
    } catch (Exception e) {
        logger.error("Error", e);
    }
于 2016-05-17T15:50:00.657 回答
4

如果您认为可以安全地忽略 SQLException,则可以将其添加到 squid:S1166 规则的异常列表中。

  1. 转到规则-> 搜索 squid:S1166。
  2. 在质量配置文件中编辑例外。
  3. 将 SQLException 添加到列表中。
于 2015-09-04T11:25:32.890 回答
4

我偶然发现了同样的问题。我不是 100% 确定我在这一点上是否完全正确,但基本上你应该重新抛出或记录完整的异常。而e.getMessage()只是给你详细的消息,而不是执行堆栈的快照。

来自Oracle 文档(Throwable)

throwable 包含其线程在创建时的执行堆栈的快照。它还可以包含提供有关错误的更多信息的消息字符串。随着时间的推移,一个 throwable 可以抑制其他 throwable 的传播。最后,throwable 还可以包含一个原因:另一个 throwable 导致该 throwable 被构造。这种因果信息的记录被称为链式异常设施,因为原因本身可以有一个原因,依此类推,导致异常“链”,每个异常都由另一个引起。

这意味着 abarre 提供的解决方案有效,因为整个异常对象 (sqle) 正在传递给记录器。

希望能帮助到你。干杯。

于 2016-04-15T10:19:47.513 回答