【问题标题】:How can you throw a checked exception without violating SonarQube?如何在不违反 SonarQube 的情况下抛出已检查异常?
【发布时间】:2019-12-21 06:16:37
【问题描述】:

有一条 SonarQube 规则指出“...no method throws a new checked exception.

它给出了以下代码示例:

public void myMethod1() throws CheckedException {
  ...
  throw new CheckedException(message);   // Noncompliant
  ...
  throw new IllegalArgumentException(message); // Compliant; IllegalArgumentException is unchecked
}

public void myMethod2() throws CheckedException {  // Compliant; propagation allowed
  myMethod1();
}

那么你怎么能真正抛出一个自定义的检查异常呢?

假设我捕获了一个 IOException 并执行 getMessage() 来获取 IOException 的详细消息字符串。

然后有条件检查字符串的内容以抛出更具体的自定义检查异常(扩展异常)。

我如何在不违反 SonarQubes 规则的情况下真正做到这一点,而我不是 throw new CheckedException(message);

这条规则是否意味着 SonarQube 永远不希望开发人员抛出新的自定义检查异常?

【问题讨论】:

  • 也许,只是也许:你能做到throw new CheckedException(cause, message)吗?也许 sonarqube 认为您捕获了异常并将其丢弃(顺便说一句:传递“原因”确实是一种很好的做法……将它们丢弃:没那么多)。
  • 规则说你不应该抛出检查异常。一点也不。它只是允许你传播扔到别处的那些。
  • @GhostCat 不。这仍然会导致 SonarQube 违规。我猜这个规则只是不想让你抛出任何新的检查异常。
  • 我不明白的是,打开规则后,如何抛出自定义检查异常?例如,您捕获一个通用异常,阅读异常详细信息,然后抛出一个更详细的自定义检查异常。

标签: java sonarqube


【解决方案1】:

这是来自规则

检查异常的目的是确保错误不会 处理,无论是通过传播它们还是通过处理它们,但有些 相信检查异常会对可读性产生负面影响 源代码,通过传播此错误处理/传播逻辑 无处不在。

此规则验证没有方法抛出新的检查异常。

这不是一个绝对的规则。 如果您想防止人们在您的代码中抛出已检查的异常,这完全取决于您。
请记住,Sonar 规则只是规则,如果您不同意某些规则,只需禁用它们即可。 尤其是这个看起来非常基于意见。

如果您无法禁用它,请将问题解决为won't fix 并添加注释以说明您需要抛出此异常,因为架构需要这样做。

我个人认为检查异常有点烦人,但我不会启用此规则,我觉得它不相关。

【讨论】:

  • 是的,我同意,但我不拥有该代码库,因此无法更改 SonarQube 规则。只需尝试修复大量 SonarQube 错误并重构意大利面条式代码。
  • 规则很简单,don't throw checked exception。如果您仍想抛出已检查的异常,请禁用该规则或将问题解决为won't fix
猜你喜欢
  • 2014-09-18
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
相关资源
最近更新 更多