私は例外をスローすることは、UIにバブルアップするか、または例外をログに記録し、そのことをユーザーに通知するようにするのがよい方法であると考えました。なぜresharperは '単一の' throw文を持つcatch節は冗長です 'と言っていますか?
なぜresharperは重複していると言いますか?
try
{
File.Open("FileNotFound.txt", FileMode.Open);
}
catch
{
throw;
}
私は例外をスローすることは、UIにバブルアップするか、または例外をログに記録し、そのことをユーザーに通知するようにするのがよい方法であると考えました。なぜresharperは '単一の' throw文を持つcatch節は冗長です 'と言っていますか?
なぜ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);
よりも違いはありません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(string, FileMode)
への呼び出しは、その方法を見つけるでしょう、まったく同じ例外をサンプリングのいずれかで、その後、失敗した場合
File.Open("FileNotFound.txt", FileMode.Open);
だから、tryを使わずにコードの行を書く方が良いですか? – orandov
はい。あなたが扱おうとしていないものを捕まえないでください。 –
@orandov - 必要はありません。たとえば、IOExceptionをキャッチして、ApplicationExceptionから派生したより意味のある(ユーザーの観点から)例外をスローすることができます。 –
tryのコードがすでに例外をスローしているためです。
例外を再スローするだけでなく、catchブロックで何か他のことを行う場合は、例外をキャッチして再スローする必要があります。
catchブロックで処理を実行しておらず、例外を再度スローしただけです。
そこにtry ... catchブロックがあるという点はないので警告します。
また、「スローex」はスタックトレースを保存せず、スローします。
それはしばらく注目に値します...
try
{
DoSomething();
}
catch
{
throw;
}
は...
try
{
DoSomething();
}
catch (Exception ex)
{
// Generally a very bad idea!
throw ex;
}
この2番目のコードスニペットは、私が継承されたコードベースを通じてはびこっていた...次はないが、reduntantですいくつかのプロジェクトが前にあり、元の例外のスタックトレースを隠すという厄介な効果があります。このようにキャッチした例外をスローすると、スタックトレースの先頭がthrow
レベルにあり、DoSomething
という言及なしに、またはネストされたメソッド呼び出しが実際に例外を引き起こしたことを意味します。
これを行う幸運のデバッグコード!
R#は、後者が「おそらく意図しない」と警告するように設定できます。 – AakashM
キャッチアンドリスローを持つことは、キャッチを持たないことと全く同じではありません。スローサイトと最初に成功したcatchとの間のすべてのcatchブロックの例外フィルタは、 'finally'ブロックが実行される前に実行されます。 catch-and-rethrowは、その中のすべての 'finally'ブロックが実行され、それ以外の例外フィルタが実行される前に実行されます。 BTWは、キャッチアンドリスローが何かをするもう1つのより一般的なキャッチブロックである場合、resharperがうれしいです(キャッチアンドリスローは後者のキャッチブロックをバイパスするようになります)。 – supercat