この回答で説明されているように、パフォーマンスへの影響はほとんどありません。
したがって、パフォーマンスは問題ではないという考えで進みましょう。あなたが投げているのはSystem.Exception
、実行をcatch
節に移すためだけです。を投げるのBadControlFlowThatShouldBeRewrittenException
はおそらくやり過ぎでしょう。
これを分解してみましょう。我々は持っています:
- メソッド
GetDataFromServer
(メソッド名はC#ではPascalCaseである必要があります)bool
。例外をスローするか、を返す可能性があります。
- 結果がだった場合
true
、実行しProcessData
ます。
null
それ以外の場合は戻ります。
このコードが書かれているメソッドは、単純に多くのことをしているように見えます。デザインの欠陥のような外観をGetDataFromServer
返すbool
、私はそのメソッドがサーバーから取得しているデータを返すことを期待します。いくつかIEnumerable<SomeType>
は0以上のアイテムを含みます-つまり、幸せなパスはn> 0のnアイテムを返しますが、それほど幸せではありませんpathは0アイテムを返し、不幸なパスは、それが何であれ、未処理の例外で爆破されます。
これにより、メソッドの外観が大きく変わります。元の投稿には1つの出口点しかないため(すべてのコードパスが値を返すわけではないため、コンパイルされないため)、これが理にかなっているかどうかを判断するのは困難です。これは大まかな推測です。
try
{
var result = GetDataFromServer();
return ProcessData(result);
}
catch
{
return null;
}
ここでProcessData
はresult
、を反復処理していることを確認し、にnull
アイテムがない場合に戻りますIEnumerable
。
では、なぜメソッドが戻るのnull
ですか?サーバーがダウンしていましたか?クエリにバグはありますか?接続文字列が間違った資格情報を使用していますか?GetDataFromServer
予期しない例外で爆破するときはいつでも、それを飲み込み、カーペットの下に押し込み、null
値を返します。この場合は特定の例外をキャッチし、それ以外はすべてログに記録することをお勧めします。そうすれば、デバッグがはるかに簡単になります。
catch
例外を捕捉しない一般的な条項があると、何かを診断するのがかなり難しくなります。代わりに、これを最小限に抑えます。
catch(Exception e)
{
return null;
}
これで、問題が発生した場合、少なくとも中断して検査e
することができます。
TL; DR:いいえ、フロー制御の例外をスローおよびキャッチすることはお勧めできません。