我是SonarQube和Squid(以及CheckStyle和FindBugs和PMD)的新手。我正在使用SonarQube 4.1.1。以及用于评估我的一些Java项目的默认“Sonar方式与Findbugs”质量配置文件。
在我的分析结果中,我从Squid获得了大量相同的关键问题:
异常处理程序应提供一些上下文并保留 原始异常处理捕获的异常时,两个必需 信息应该被记录,或者在重新存在时出现 例外:
- 一些缓解问题再现的背景。
- 原始异常,用于消息和堆栈跟踪。
在我的代码中,我使用记录器,例如
catch(Exception e) {
LOG.error(SampleClass.class.getSimpleName() + ": " + e);
}
为什么这条规则被解雇了?记录异常。是吗,因为我不使用'Logger'而是使用'Log'?
我的第二个问题是:我在哪里可以看到并更改Squid规则,也许可以添加一些我自己的规则?据我所知,FindBug,CheckStyle和PMD我可以编写自己的规则。鱿鱼也可以吗?
答案 0 :(得分:3)
我相信该规则正在被解雇,因为您正在从Exception e记录简单的toString()消息,而不是完整的堆栈跟踪。像
这样的东西LOG.error(SampleClass.class.getSimpleName() + ": " + e, e);
会满足规则。
SonarQube在每个规则定义中都有非常好的符合/不符合规范的示例。在问题或质量配置文件中展开规则的名称以查看示例。
您可以通过创建自己的“Sonar Way ...”继承的配置文件来更改(某些方面)默认质量配置文件,然后更改规则。您需要管理员访问SonarQube才能执行此操作,然后导航到质量配置文件以开始使用。
例如,我们的团队认为您所查看的特定问题不应该是严重的,因为它在我们的遗留代码中出现的次数。我们创建自己的继承自Sonar Way的配置文件,并且很容易将此规则的严重性降低到Major。我们更改了许多规则,更改了阈值和/或正则表达式以更好地满足我们的需求。我们没有看到编写新规则的必要性,所以我不能告诉你如何做到这一点,除了建议检查文档。
答案 1 :(得分:0)
试试这个
Log.e(TAG, e.getMessage(), e);
答案 2 :(得分:0)
可以为SonarQube定义自己的规则。请查看此问题Sonarqube: Squid Rules customization/suppression,了解如何使文档链接保持最新状态。
答案 3 :(得分:0)
在我看来,这条具体规则过于严格。我如何处理异常需要更灵活。旧的(pre-Squid)规则倾向于抱怨什么都不做的异常处理程序,而这个规则现在要求每个异常处理程序都需要共享消息和原始异常的堆栈。我已将该规则降级为我的团队项目的次要规则,因为我们有近800次违规,其中很少是重要的。一旦得到团队其他成员的同意,我打算弃用这条规则。我将回到旧的弃用规则。
在我看来,如果我的代码调用外部代码,那么当我报告异常时,我不需要通过该代码共享堆栈跟踪。有人用NumberFormatException
调试我的代码可能并不关心NFE在数字解析中经历了多少层,他们可能只关心我的代码无法验证数字以及在哪里查找该修复我的代码。抑制原始堆栈跟踪对我来说很有意义。