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

Nit*_*tal 16 java exception-handling maven 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;
    }
Run Code Online (Sandbox Code Playgroud)

aba*_*rre 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);
}
Run Code Online (Sandbox Code Playgroud)

声纳不应该打扰你了

  • 在我看来,这个声纳投诉过于严格.您可能期望捕获和忽略异常,例如,可能会捕获`FileNotFoundException`并且记录一条消息,指示找不到该文件,并且没有它就会继续执行 - 没有人需要此方案的整个堆栈跟踪.然而,除了使用// NOSONAR标记捕获线之外,没有办法让声纳关闭它. (3认同)
  • 如果异常类似于 java.util.concurrent.ExecutionException 并且您确实只想记录原因,该怎么办?我在下面看到一条关于忽略特定异常的评论!谢谢! (2认同)

Dan*_*ele 6

声纳要求你做的是坚持整个异常对象.您可以使用以下内容:

    try {
        ...         
    } catch (Exception e) {
        logger.error("Error", e);
    }
Run Code Online (Sandbox Code Playgroud)


jim*_*jim 5

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

来自Oracle 文档(可抛出)

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

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

希望能帮助到你。干杯。