Sonar抱怨记录和重新抛出异常

时间:2015-01-24 04:23:46

标签: java maven exception-handling sonarqube sonarqube-5.0

我的程序中有以下代码,在与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 个答案:

答案 0 :(得分:33)

你应该这样做:

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

声纳不应再打扰你了

答案 1 :(得分:6)

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

    try {
        ...         
    } catch (Exception e) {
        logger.error("Error", e);
    }

答案 2 :(得分:3)

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

  1. 转到规则 - >搜索鱿鱼:S1166。
  2. 编辑质量资料中的例外情况。
  3. 将SQLException添加到列表中。

答案 3 :(得分:3)

我偶然发现了同样的问题。我不是百分之百确定我是否完全正确,但基本上你应该重新抛出或记录完整的异常。而e.getMessage()只是为您提供详细消息,而不是执行堆栈的快照。

来自Oracle docs (Throwable)

  

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

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

希望它有所帮助。 欢呼声。