5
try {
    // code which throws exception.
} catch (SQLException sqlex) {
    logger.error("Custom message", sqlex);
    **throw new CustomApplicationException("Custom message", sqlex);**
}

上記の例では、太字の行で、「キャッチ ブロックで新しい例外がスローされたため、元のスタック トレースが失われる可能性があります」という PMD エラーが発生しています。この質問は何度も聞かれていることも知っていますが、同じことについてオンラインで参照できる情報もたくさんあります。私は可能なすべての方法を試しました。しかし、それでもこの PMD エラーを取り除くことはできません。このコード スライスの問題点を教えてください。前もって感謝します!

4

6 に答える 6

5

そのコードに問題はないと思います。

しかし、私はまた、PMDがそのコードに対してそのエラーを与える/与えるべきだとは思いません。IIRC、次のようなエラーが発生します。

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

古いバージョンの PMD を使用しているか、使用している PMD ルールが誰かによって「改善」されている可能性があります。

于 2011-06-21T05:41:27.780 に答える
3

元のスタック トレースを保持するには、次のように例外クラスを変更する必要があります

try {
    // code which throws exception.
} catch (SQLException sqlex) {
    throw new CustomApplicationException("Any Message", sqlex);
}

CustomApplicationException.java

public class CustomApplicationException extends RuntimeException {

  public CustomApplicationException() {
  }

  public CustomApplicationException(String message) {
    super(message);
  }

  public CustomApplicationException(String message, Throwable cause) {
    super(message, cause);
  }

}
于 2020-03-27T09:54:25.730 に答える
1

コード チェッカーは、問題を検出するのに最適です。ただし、この場合、コードは問題なく、PMD はおそらく過保護です。エラーに関する PMD のドキュメントを確認し、他に考慮すべきことがあるかどうかを確認してください。次に、コードにまだ満足している場合は、//NOPMDタグを追加して、PMD にその行を無視させることができます。これが自動なのか、//NOPMD を探すように PMD を設定する必要があるのか​​思い出せません。

このような PMD チェックのインライン例外も実際には推奨されておらず、ベスト プラクティスと見なすべきではないことに注意してください。しかし、PMD のようなコード チェッカーでは、何らかの理由で無視したいフラグが時折発生します。

于 2011-06-21T05:49:59.873 に答える
0

どのバージョンの PMD を使用していますか? 新しいバージョンで修正された誤検知が表示される場合があります。(リンクは、そのような誤検知が修正された 1 つの場所へのリンクです。複数ある場合があります。)

使用している Java のバージョンと、catch ブロックで別の Exception をスローする正確な方法によっては、完全なスタック トレース情報が失われる可能性があります。最新の PMD バージョンを使用していて、この苦情を受け取った場合は、sourceforge ページで PMD のエラーを報告し、他の人が言っているように、その苦情の特定のインスタンスを一時的に無効にすることをお勧めします。

于 2011-06-21T06:22:04.773 に答える