我的程序中有以下代码,在与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;
}
这样做:
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);
}
声纳不应该再打扰你
声纳要求您做的是保留整个异常对象。您可以使用以下内容:
try {
...
} catch (Exception e) {
logger.error("Error", e);
}
我偶然发现了同样的问题。我不是 100% 确定我在这一点上是否完全正确,但基本上您应该重新抛出或记录完整的异常。而e.getMessage()
只为您提供详细的消息,而不是执行堆栈的快照。
来自 Oracle 文档(可抛出):
可抛投对象包含创建时其线程的执行堆栈的快照。它还可以包含一个消息字符串,该字符串提供有关错误的详细信息。随着时间的推移,可抛掷对象可以抑制其他可抛掷物的传播。最后,可抛物还可以包含一个原因:导致构造此可抛物的另一个可抛出物。这种因果信息的记录被称为链式异常工具,因为原因本身可以有一个原因,依此类推,导致一个异常的"链",每个异常都是由另一个引起的。
这意味着 abarre 提供的解决方案有效,因为整个异常对象 (sqle) 正在传递给记录器。
希望对您有所帮助。干杯。
如果您认为可以安全地忽略 SQLException,则可以将其添加到 squid:S1166 规则的例外列表中。
- 转到规则>搜索鱿鱼:S1166。
- 在质量配置文件中编辑例外。
- 将 SQLException 添加到列表中。