例外をスローすることは、UI または例外をログに記録してユーザーに通知する場所にバブルを戻すための良い方法だと思いました。
resharper が冗長であると言うのはなぜですか?
try
{
File.Open("FileNotFound.txt", FileMode.Open);
}
catch
{
throw;
}
例外をスローすることは、UI または例外をログに記録してユーザーに通知する場所にバブルを戻すための良い方法だと思いました。
resharper が冗長であると言うのはなぜですか?
try
{
File.Open("FileNotFound.txt", FileMode.Open);
}
catch
{
throw;
}
なぜなら
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);
}
冗長ではありません。
上記のステートメントは、存在しない場合と同じ動作をするためです。書くのと同じ:
File.Open("FileNotFound.txt", FileMode.Open);
冗長だからです。
try のコードが既に例外をスローしているためです。
例外の再スローに加えて、catch ブロックで何か他のことを行う場合にのみ、例外をキャッチして再スローする必要があります。
注目に値するのは...
try
{
DoSomething();
}
catch
{
throw;
}
...冗長ですが、以下はそうではありません...
try
{
DoSomething();
}
catch (Exception ex)
{
// Generally a very bad idea!
throw ex;
}
この2番目のコードスニペットは、私が数プロジェクト前に継承したコードベースに溢れていました。これには、元の例外のスタックトレースを非表示にするという厄介な効果があります。この方法でキャッチした例外をスローするということは、スタックトレースの最上位がレベルにあり、ネストされたメソッド呼び出しが実際に例外を引き起こしたことthrow
についての言及やものがないことを意味します。DoSomething
これを行うデバッグコードを頑張ってください!
catch ブロックで処理を行っておらず、例外を再度スローしただけです。
そこに try...catch ブロックを配置しても意味がないため、警告が表示されます。
また、もう 1 つの良いヒントは、「throw ex」はスタック トレースを保存しないが、「throw」は保存するということです。