再シャーパーが「単一の「スロー」ステートメントを含むキャッチ節は冗長である」と言うのはなぜですか?
-
06-07-2019 - |
質問
例外をスローすることは、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ブロックで別の操作を行う場合にのみ、例外をキャッチして再スローする必要があります。
冗長であるため。
catchブロックで処理を行っておらず、再度例外をスローしました。
このtry ... catchブロックを使用しても意味がないため、警告が表示されます。
また、別の良いヒントは、「throw ex」です。スタックトレースは保持されませんが、「投げる」
その間は注目に値します...
try
{
DoSomething();
}
catch
{
throw;
}
...は冗長ですが、次はそうではありません...
try
{
DoSomething();
}
catch (Exception ex)
{
// Generally a very bad idea!
throw ex;
}
この2番目のコードスニペットは、私がいくつかのプロジェクトを前に継承したコードベースにあふれており、元の例外のスタックトレースを隠すという厄介な効果があります。この方法でキャッチした例外をスローするということは、スタックトレースの最上位が throw
レベルにあり、 DoSomething
やネストされたメソッド呼び出しが実際に発生したことについては言及されていないことを意味します例外。
これを行う幸運なデバッグコード!