【问题标题】:Why SonarQube complains about generic Exception when the exception has been changed to custom one为什么当异常已更改为自定义异常时,SonarQube 会抱怨通用异常
【发布时间】:2021-10-12 16:08:25
【问题描述】:

我的任务是为其他人长期以来制作的应用程序进行 JUnit 测试,我无法修改原始代码,所以当我遇到这样的事情时:

public String clean(String url) throws Exception {
    if (url.indexOf(invalidURL) {
        throw new Exception("Severe XSSS detected");
    }
}

我编写测试时使用:抛出异常,SonarQube 抱怨通用异常,如果我编写自定义异常,例如:public class MyException extends Exception,SonarQube 仍然不喜欢它,任何帮助将不胜感激!

【问题讨论】:

  • “仍然 sonarqube 不喜欢它”?
  • 您可以更准确地说:SonarQube 的确切错误信息是什么?这可以帮助理解这里的规则。 SonarQube 正在使用具有数百条规则的大量工具……

标签: java generics exception sonarqube


【解决方案1】:

我正在解释您的代码:如果参数 url 包含此无效 URL,您似乎在某处有一个无效的 URL,并且您不想做您的业务。所以我猜IllegalArgumentException 比通用的Exception 精确得多。

来自IllegalArgumentException的JavaDoc:

抛出表明一个方法被传递了一个非法或不适当的参数。

此外,我认为 SonarQube 在这一点上会接受IllegalArgumentException 而不会抱怨。

【讨论】:

    【解决方案2】:

    现有答案提供了有用的信息,但如果您在原始帖子中指定的限制是正确的,那么这些答案并没有真正的帮助。

    如果您实际上无法修改被测代码,则无法修复 SonarQube 问题。

    【讨论】:

      【解决方案3】:

      MyException 扩展了Exception,因此您也必须更改方法声明 - throws 语句:

      public String clean(String url) throws MyException {
         if (url.indexOf(invalidURL) {
            throw new MyException("Severe XSSS detected");
         }
      }
      

      更改是安全的,因为代码与之前的选项兼容:

      try {
          object.clean("invalidUrl")
      } catch (Exception e) {
          // MyException is handled by this catch block
      }
      

      【讨论】:

      • 我不允许更改方法声明,但感谢您的帮助,我结束了使用“//NOSONAR”以避免这种代码异味
      • 为什么不允许?它以相同的方式工作,但没有任何代码异味问题。 // NOSONAR 是一个非常糟糕的解决方案。它隐藏了问题,而不是解决它。它还隐藏了指定行中的所有其他问题,因此您不会被告知将来所有可能引入的新问题。
      • 我的任务只是进行junit测试,而不是修复所覆盖系统的原始代码,我是一个旧系统,许多其他系统都依赖它,做一个小的改变需要多部门许可
      猜你喜欢
      • 2017-01-17
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 2019-06-24
      • 2020-09-02
      相关资源
      最近更新 更多