2011-06-21 16 views
2
 try { 
      // code which throws exception. 
     } catch (SQLException sqlex) { 
      logger.error("Custom message", sqlex); 
      **throw new CustomApplicationException("Custom message", sqlex);** 
     } 

在上面的例子中,在粗線,我得到PMD錯誤爲「新的異常是在catch塊拋出,原來堆痕跡可能會丟失「。我知道這個問題已被多次詢問,也有許多在線參考資料可供使用。我嘗試了所有可能的方式。但仍然無法刪除此PMD錯誤。請讓我知道這個代碼片段最新的錯誤。 在此先感謝!Java錯誤:新的異常在catch塊拋出,原來的堆棧跟蹤可能會丟失

回答

4

我不認爲這個代碼有什麼問題。

但我也認爲,不要認爲PMD會/應該爲該代碼提供該錯誤。 IIRC,你會得到錯誤的東西是這樣的:

try { 
     // code which throws exception. 
    } catch (SQLException sqlex) { 
     throw new CustomApplicationException("Custom message"); // no cause! 
    } 

這可能是你有一箇舊版本的PMD的或者有人被「提高」的PMD規則正在使用。

+0

我認爲你是對的。這是一個findbugs錯誤。堆棧跟蹤不會丟失。 –

1

代碼檢查器對於發現問題是很棒的事情。但是在這種情況下,你的代碼很好,PMD可能會過度保護。查看PMD中有關錯誤的文檔,看看是否還有其他需要考慮的事項。然後,如果您的代碼仍然滿意,您可以添加一個// NOPMD標記,以使PMD忽略該行。我不記得這是否是自動的,或者您必須配置PMD以查找// NOPMD。

請注意,這樣的PMD檢查的內聯異常也不是真的推薦,當然也不應該被視爲最佳實踐。但是對於像PMD這樣的代碼檢查工具,偶爾會出現因爲某些原因你想忽略的標誌。

0

您使用的是什麼版本的PMD?您可能會看到一個false positive固定在較新版本中。 (鏈接只是一個地方,這種誤報是固定的,可能不止一個)

根據您使用的Java版本以及您在catch塊中如何拋出另一個Exception,確實有可能丟失完整的堆棧跟蹤信息。如果您正在使用最新的PMD版本,並且您收到此投訴,則可能希望在sourceforge頁面上向PMD報告錯誤,然後暫時禁用該投訴的特定實例(如其他人所說的那樣)。

0

有必要拋出已觸發除外:

try { 
     // code which throws exception. 
    } catch (SQLException sqlex) { 
     /* You can show a specific log here (See below) */ 
     throw sqlex; 
    } 

如果你想顯示一個特定的日誌,你可以使用一個記錄:

/* Use this imports */ 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
... 
/* Declare as global variable */ 
private Logger logger = LoggerFactory.getLogger(this.getClass()); 
public Logger getLogger() { 
    return logger; 
} 
public void setLogger(Logger logger) { 
    this.logger = logger; 
} 
/* Use in any place */ 
logger.error(" an error "); 
logger.trace(" operational trace "); 
logger.debug(" specific trace for debugging "); 

如果您正在使用Maven ,在你的pom.xml中聲明:

<dependencyManagement> 
     <dependencies> 
      <dependency> 
       <groupId>org.slf4j</groupId> 
       <artifactId>slf4j-simple</artifactId> 
       <version>1.5.2</version> 
       <scope>provided</scope> 
      </dependency> 
     </dependencies> 
    </dependencyManagement>