繁体   English   中英

SonarQube错误:重构此方法最多抛出一个已检查的异常

[英]SonarQube error: Refactor this method to throw at most one checked exception

我正在使用SonarQube,它显示以下错误:

Public methods should throw at most one checked exception.

// Noncompliant
public void delete() throws IOException, SQLException { /* ... */ }

// Compliant
public void delete() throws SomeApplicationLevelException { /* ... */ }

这是否意味着, SomeApplicationLevelException是一个父类, IOExceptionSQALException是从它派生的? 我们应该抛出父类异常? 从而坚持只抛出1个检查异常的方法?

因为我有2个例外,我已经定义了例如Exception1Exception2来扩展Exception 我的方法说, sampleMethod()抛出它们,即

public void sampleMethod() throws Exception1, Exception2 {
}

这里显示错误。 那么我应该将一个类作为父类(比如MainException )并从中派生Exception1Exception2并抛出父异常类吗? 如下所示:

public void sampleMethod() throws MainException {
}

以上解决方案是否合适?

如果您的应用程序中有一个声明为throws SQLException, IOException ,您可能会将内部实现细节泄露给方法的用户。 具体来说,你说:

  1. 您的方法是使用JDBC和文件I / O实现的。 您的用户不关心您的方法是如何实现的; 他们只关心你的方法做什么。

  2. 您的方法, 包括它的任何未来版本 ,将永远不会抛出任何其他已检查的异常。 如果将来更改方法以便它可能抛出另一个已检查的异常,它将破坏向后兼容性。

建议是创建自己的特定于应用程序的类(派生自Exception),并且只在您的方法中抛出它。 如果您愿意,可以将特定于应用程序的异常中的SQLException或IOException(或任何其他异常)包装为原因

但请注意,有一种思想流派认为Java检查异常是一个坏主意 (C#的原因之一,以及更多现代语言,如Kotlin,没有检查异常)。

更新:上述答案与问题的第一个版本有关(编辑#1)。 随后更新了这个问题,指出两个抛出的异常是应用程序定义的异常,因此上述大部分理由不再适用。 答案将更新问题中解释这个职位

IOexception和sqlexception都是经过检查的异常,彼此完全不同,现在如果我们从一个异常扩展并抛出父异常(这在java中不是必需的),它将会误导api的用户。

但是,如果你想在你的应用程序中这样做以避免sonarqube错误,你可以捕获所有特定的异常并抛出一个自定义异常包装异常消息中的原始异常信息。

例如

try{

      ///piece of code that throws IOException and SQLException
}catch(IOException | SQLException ex){
   throw new DataException(ex,"Any customized message you want");
}

然后,此DataException将包含在具有此try catch的方法签名的throws子句中。

DataException扩展了Exception类,并通过在构造函数中传递ex,将原始异常包装在自定义异常中,并保留原始异常信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM