try/catchブロックをループから外す必要があるのはなぜですか?

Here is CodeReview Guideline by Practice&Patterns team.http://msdn.microsoft.com/zh-cn/library/ms998574#scalenetchapt13_topic7(The link navigate to the Exception section automaticly.)

彼らはあなたが例外を処理するときにtry/catchブロックをループから外すべきだと言いました、なぜ私は知りたいのですか?

11

4 答え

try ... catch ブロックの基礎となる実装は、生成されたコードにオーバーヘッドを追加し、オーバーヘッドをタイトなループに入れることは、パフォーマンス上の理由ではありません。

技術的には、ループのすべての反復が「等しい」で、例外が発生するとすぐにループを停止する必要がある場合は、 try ... catch ブロックをループ外に置く方がよいでしょう。例外が発生したにもかかわらずループを続行する必要がある場合は、ブロックをループ内に置く必要がありますが、その場合はデザインを確認することをお勧めします。

16
追加された
+1 try/catchブロックを指しているだけで、例外に限らず、唯一の「正しい」答えです。しかし、「リスナー」の1つが例外をスローすると、処理を続行するような設計があります。私はその書き換えがどのようにできるのだろうか?たとえば、次のようになります。 foreach(リスナーのvarリスナー){try {invoke(Y); } catch(Exception err){_logger.Warning( "クライアントXXはbla blaを実行しました"、err); }}
追加された 著者 jgauffin,
ニースの解決策。しかし、あなたが言うように、それは必要とされていることが証明されている(ベンチマークまたは他の措置によって)のみ使用すべきです。
追加された 著者 jgauffin,
これは良い例です:通常、このような状況では、 try ブロックのオーバーヘッドは invoke()で費やされた時間と比較して無視できる程度です。しかし、そうでない場合は、ネストされたループを使用して各繰り返しで例外をキャッチしないようにすることができます。これにより、 invoke()への呼び出しの大半が成功するとパフォーマンスが向上します。 int i = 0、len = listeners.lengthのようなものです。 while(i
追加された 著者 Frédéric Hamidi,

例外は高価です - 例外ロジックをループ内に置くと、ループ内のすべての反復で例外がスローされる危険性があります。これにより、パフォーマンスの問題が発生しやすくなります。

try/catchブロックをループの外に置くと、1つの例外だけを処理する必要があります。

10
追加された
私は例外がスローされる場合、ループが確実に切断されると思います。したがって、try/catchをループに入れるかどうかに関係なく、例外は1回だけスローされます。そうですか?
追加された 著者 Domi.Zhang,
@ Domi.Zhang - いいえ、 catch で例外を処理すると、ループが再開します。
追加された 著者 Oded,

ループ内の try/catch は、常に例外を元に戻さない限り、ループ外のものとは異なる動作をします。

したがって、あなたの選択はあなたの必要条件に依存します:あなたがループを続けたい場合は、ループ内にキャッチします。

私は、推薦の理由は、ループ内で try/catch がコントロールフローの例外を使うのと同じように見えることだと思います。それは、硬くて速いルールを述べるのではなく、潜在的な "コードの匂い"に気づいている。

しかし、それがあなたの要件が指示するものならば、推奨を無視することは合理的です。 Int32.TryParse のない世界では、シンプルだが古くなった例を取るためには(.NET 1.xはそれほど前ではありませんでした!)、リストを解析するループを持つことは妥当でしょうループ内のtry/catchで Int32.Parse を使用して文字列を整数に変換します。

2
追加された
人々が気に入っているかどうかにかかわらず、ブロックありを試してみてください。ループの外側または内側のいずれかで、例外が発生した場合は フローを制御します
追加された 著者 ThunderGr,

ループ内に複数の例外が表示される可能性があるため、アプリケーションで不要なオーバーヘッドが発生します。

そこにエラーが見つかった場合、ループの外側で処理する方が意味があります。

1
追加された
確かにオーバーヘッドが発生します。コードを見ることなく、オーバーヘッドが必要かどうかを言うことはできません。
追加された 著者 Joe,