簡體   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