StyleCopまたはVS2010を使用してC#の例外を再スローの悪い方法を検出する方法は?
質問
私の同僚は、C ++、ハッカーが.NETに切り替え味付けされています。過ちの一つは、彼らが作ることに、このような無意識に書いているコードます:
catch(ArgumentExcepttion ae)
{
// Code here logs the exception message
// And this is supposed to re-throw the exeception
throw ae; // as opposed to throw;
// But, as we all know, doing this creates a new exception with a shorter stack trace.
}
私は、これは、多くの多くの場所で行って見てきました。私は実際に有用であろうスタックトレース遮断状況を考えることはできません。私はコメントに値する例外的な状況であるべきだと思います。私が間違っているなら、私を修正してください。スタックトレースをカットすることであるならば、私はそれを行うには、常により良いと思います:
throw new ArgumentException("text", ae /* inner exc */);
とにかく、何を私はやりたいことはすべて、このようなケースを検出し、 に警告を与えます。正規表現検索は、このため、役に立たないのです。
catch(Exception e)
{
Exception newExc = new Exception("text", e);
Log(newExc);
throw newExc;
}
Iは、(私は、バージョン4.3.3.0)StyleCopなどのツールを使用しなければなりません。私は今のVS2008を使用していますが、非常にすぐにVS2010への切り替えされます。
私が探しています何を達成する方法上の任意の考え?
解決
FxCopのは、このためのルールがあります: RethrowToPreserveStackDetailsする
例外がスローされたら、、の一部 それが運ぶ情報があります スタックトレース。スタックトレースはリストです そのメソッドの呼び出し階層の スローするメソッドで始まります この方法で例外と終了 それは、例外をキャッチします。もし 例外が指定して再スローされます throw文で例外、 スタックトレースがで再開されます 現在のメソッドとメソッドのリスト 元のメソッド呼び出しの間その 例外と現在の投げました この方法は失われます。オリジナルを維持するために、 とスタックトレース情報 例外、throwステートメントを使用します 例外を指定せずます。
私は信じてFxCopの分析はVS2010に組み込まれていますが、私は確信して100%ではないよ...
ここでマイクロソフトのダウンロードリンクがありますFxCopののます。
他のヒント
は、不必要な例外をキャッチするコードは、ですか?あなたが唯一の例外をログに興味がある場合は、あなただけ(ロギングを行うことができ、最後の可能性の点で)あなたのコードの最上位レベルでの漁獲量を必要としています。これは真剣に心配することはあなたが持っている漁獲量の数を減らすことができます。
私は...スローで終わるのcatchブロックを探すことを示唆しています。代わりに、スローで終わるの;ます。
あなたには、いくつかの偽陽性を取得しますが、、あなたは手でそれらをフィルタリングすることができます。