4

私の同僚は、.Netに切り替える経験豊富なC++ハッカーです。彼らが意図せずに犯す間違いの1つは、次のようなコードを書くことです。

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;
}

StyleCop(私が持っているバージョン4.3.3.0)などのツールを使用する必要があります。今はVS2008を使用していますが、間もなくVS2010に切り替えます。

私が探していることを達成する方法について何か考えはありますか?

4

3 に答える 3

5

FxCop には、このためのルールがあります: RethrowToPreserveStackDetails

例外がスローされると、それが運ぶ情報の一部はスタック トレースです。スタック トレースは、例外をスローするメソッドで始まり、例外をキャッチするメソッドで終わるメソッド呼び出し階層のリストです。throw ステートメントで例外を指定して例外が再スローされた場合、スタック トレースは現在のメソッドで再開され、例外をスローした元のメソッドと現在のメソッドの間のメソッド呼び出しのリストは失われます。例外で元のスタック トレース情報を保持するには、例外を指定せずに throw ステートメントを使用します。

FxCop Analysis は VS2010 に組み込まれていると思いますが、100% 確実ではありません...

FxCopのMicrosoft ダウンロード リンクは次のとおりです。

于 2010-05-14T16:00:07.260 に答える
1

コードが不必要に例外をキャッチしていませんか? 例外をログに記録することのみに関心がある場合は、コードのトップ レベル (ログを実行できる最後の可能なポイント) でのみ catch が必要です。これにより、心配する必要があるキャッチの数を大幅に減らすことができます。

于 2010-05-14T15:58:49.553 に答える
1

スローで終わるキャッチブロックを探すことをお勧めします...; throw; で終わる代わりに。

誤検知が発生する場合がありますが、手動で除外できます。

于 2010-05-14T15:59:04.520 に答える