pgm*_*man 4 java exception-handling sonarqube
我正在使用SonarQube,它显示以下错误:
Public methods should throw at most one checked exception.
// Noncompliant
public void delete() throws IOException, SQLException { /* ... */ }
// Compliant
public void delete() throws SomeApplicationLevelException { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
这是否意味着,SomeApplicationLevelException是一个父类,IOException并且SQALException是从它派生出来的?我们应该抛出父类异常?从而坚持只抛出1个检查异常的方法?
因为我有2个例外,我已经定义了例如说Exception1和Exception2扩展Exception.我的方法说,sampleMethod()抛出它们,即
public void sampleMethod() throws Exception1, Exception2 {
}
Run Code Online (Sandbox Code Playgroud)
这里显示错误.所以我应该有一个类作为父(说MainException),并获得Exception1和Exception2从它扔父异常类?如下所示:
public void sampleMethod() throws MainException {
}
Run Code Online (Sandbox Code Playgroud)
以上解决方案是否合适?
如果您的应用程序中有一个声明为的方法throws SQLException, IOException,那么您可能会将内部实现详细信息泄露给方法的用户.具体来说,你说:
您的方法是使用JDBC和文件I/O实现的.您的用户不关心您的方法是如何实现的; 他们只关心你的方法做什么.
您的方法,包括它的任何未来版本,将永远不会抛出任何其他已检查的异常.如果将来更改方法以便它可能抛出另一个已检查的异常,它将破坏向后兼容性.
建议是创建自己的特定于应用程序的类(派生自Exception),并且只在您的方法中抛出它.如果您愿意,可以将特定于应用程序的异常中的SQLException或IOException(或任何其他异常)包装为原因.
但请注意,有一种思想流派认为Java检查异常是一个坏主意(C#的原因之一,以及更多现代语言,如Kotlin,没有检查异常).
更新:上述答案与问题的第一个版本有关(编辑#1).随后更新了这个问题,指出两个抛出的异常是应用程序定义的异常,因此上述大部分理由不再适用.答案将更新问题中解释这个职位.
IOException 和 sqlexception 都是检查异常,彼此完全不同,现在如果我们从一个异常扩展两者并抛出父异常(这在 java 中不是强制性的),这将是一种误导 api 的用户。
但是,如果您想在您的应用程序中执行此操作以避免 sonarqube error ,您可以捕获所有特定异常并抛出一个自定义异常,将原始异常信息包装在异常消息中。
例如
try{
///piece of code that throws IOException and SQLException
}catch(IOException | SQLException ex){
throw new DataException(ex,"Any customized message you want");
}
Run Code Online (Sandbox Code Playgroud)
然后,该 DataException 将包含在具有该 try catch 的方法签名的 throws 子句中。
DataException 扩展了 Exception 类,并通过在构造函数中传递 ex ,您可以将原始异常包装在自定义异常中,并保留原始异常信息。
| 归档时间: |
|
| 查看次数: |
4558 次 |
| 最近记录: |