20

例外をスローすることは、UI または例外をログに記録してユーザーに通知する場所にバブルを戻すための良い方法だと思いました。

resharper が冗長であると言うのはなぜですか?

try
{
    File.Open("FileNotFound.txt", FileMode.Open);
}
catch
{
    throw;
}
4

6 に答える 6

57

なぜなら

try {
    File.Open("FileNotFound.txt", FileMode.Open);
} catch {
    throw;
}

と変わらない

File.Open("FileNotFound.txt", FileMode.Open);

への呼び出しがFile.Open(string, FileMode)失敗した場合、どちらのサンプルでもまったく同じ例外が UI に到達します。

上記のcatch節では、ロギング、トランザクションのロールバック、例外をラップして追加情報を追加するなど、他に何もせずに単に例外をキャッチして再スローしています。

でも、

try {
    File.Open("FileNotFound.txt", FileMode.Open);
} catch(Exception ex) {
    GetLogger().LogException(ex);
    throw;
}

冗長性を含まないため、ReSharper は文句を言うべきではありません。同じく、

try {
    File.Open("FileNotFound.txt", FileMode.Open);
} catch(Exception ex) {
    throw new MyApplicationException(
        "I'm sorry, but your preferences file could not be found.", ex);
}

冗長ではありません。

于 2009-06-19T17:58:03.853 に答える
17

上記のステートメントは、存在しない場合と同じ動作をするためです。書くのと同じ:

File.Open("FileNotFound.txt", FileMode.Open);
于 2009-06-19T17:56:28.003 に答える
5

冗長だからです。

于 2009-06-19T18:00:08.607 に答える
4

try のコードが既に例外をスローしているためです。

例外の再スローに加えて、catch ブロックで何か他のことを行う場合にのみ、例外をキャッチして再スローする必要があります。

于 2009-06-19T17:58:08.033 に答える
1

注目に値するのは...

try
{
    DoSomething();
}
catch
{
    throw;
}

...冗長ですが、以下はそうではありません...

try
{
    DoSomething();
}
catch (Exception ex)
{
    // Generally a very bad idea!
    throw ex;
}

この2番目のコードスニペットは、私が数プロジェクト前に継承したコードベースに溢れていました。これには、元の例外のスタックトレースを非表示にするという厄介な効果があります。この方法でキャッチした例外をスローするということは、スタックトレースの最上位がレベルにあり、ネストされたメソッド呼び出しが実際に例外を引き起こしたことthrowについての言及やものがないことを意味します。DoSomething

これを行うデバッグコードを頑張ってください!

于 2009-07-23T08:17:55.310 に答える
1

catch ブロックで処理を行っておらず、例外を再度スローしただけです。

そこに try...catch ブロックを配置しても意味がないため、警告が表示されます。

また、もう 1 つの良いヒントは、「throw ex」はスタック トレースを保存しないが、「throw」は保存するということです。

于 2009-06-19T17:58:21.433 に答える