編集:私は、C#6.0以降、例外フィルターは完全に優れた方法であると言っている他の人にも同意します:catch (Exception ex) when (ex is ... || ex is ... )
ただし、1本の長い行のレイアウトはまだ嫌で、個人的には次のようにコードをレイアウトします。理解力が高まると思うので、見た目と同じくらい機能的だと思います。一部は同意しないかもしれません:
catch (Exception ex) when (
ex is ...
|| ex is ...
|| ex is ...
)
元の:
私はここでのパーティーに少し遅れていることを知っていますが、聖なる煙...
追跡に直行すると、この種の方法は以前の答えを複製しますが、いくつかの例外タイプに対して共通のアクションを実行し、1つのメソッドの範囲内ですべてをきちんと整頓したい場合は、ラムダを使用しないでください。 / closure / inline関数は次のようなことをしますか?つまり、そのクロージャを、あらゆる場所で利用できる個別のメソッドにしたいことに気づく可能性はかなり高いです。しかし、そうすれば、コードの残りの部分を実際に構造的に変更することなく、それを簡単に実行できます。正しい?
private void TestMethod ()
{
Action<Exception> errorHandler = ( ex ) => {
// write to a log, whatever...
};
try
{
// try some stuff
}
catch ( FormatException ex ) { errorHandler ( ex ); }
catch ( OverflowException ex ) { errorHandler ( ex ); }
catch ( ArgumentNullException ex ) { errorHandler ( ex ); }
}
私は仕方がないのではないか(警告:少し皮肉/皮肉なのですが)なぜ地球上でこのすべての取り組みに取り組み、基本的に次のものを置き換えるだけなのでしょうか。
try
{
// try some stuff
}
catch( FormatException ex ){}
catch( OverflowException ex ){}
catch( ArgumentNullException ex ){}
...次のコードのにおいのクレイジーなバリエーションで、つまり、いくつかのキーストロークを節約しているふりをするための例です。
// sorta sucks, let's be honest...
try
{
// try some stuff
}
catch( Exception ex )
{
if (ex is FormatException ||
ex is OverflowException ||
ex is ArgumentNullException)
{
// write to a log, whatever...
return;
}
throw;
}
自動的に読みやすくなるわけではないからです。
確かに、私/* write to a log, whatever... */ return;
は最初の例から3つの同一のインスタンスを残しました。
しかし、それは私の主張のようなものです。Y'allは関数/メソッドについて聞いたことがありますか?真剣に。共通のErrorHandler
関数を記述し、同様に各catchブロックから呼び出します。
私に尋ねると、2番目の例(if
およびis
キーワードを使用)は、可読性が大幅に低下すると同時に、プロジェクトのメンテナンスフェーズでエラーが発生しやすくなります。
プログラミングに比較的慣れていない可能性がある人にとって、メンテナンスフェーズはプロジェクトの全ライフタイムの98.7%以上を占めることになり、メンテナンスを行う貧しいシュマックはほぼ間違いなくあなた以外の誰かになります。そして、彼らが自分の時間の50%をあなたの名前をののしる仕事に費やす可能性は非常に高いです。
そしてもちろんのFxCopのあなたに、あなたがしなければならないので、鳴き声も正確に動作しているプログラムで行うにはジップたあなたのコードに属性を追加し、例99.9%で、それは完全であるという問題を無視するようにFxCopのを伝えることしかありませんフラグ設定で修正します。そして、申し訳ありませんが、私は間違っているかもしれませんが、その「無視」属性が実際にアプリにコンパイルされてしまいませんか?
if
テスト全体を1行にすると、読みやすくなりますか?私はそうは思いません。つまり、別のプログラマーが1行前により多くのコードを配置すると、コードが「より高速に実行される」と強く主張しました。しかし、もちろん彼は荒れ狂う猛烈な勢いでした。インタープリターまたはコンパイラーがその長い行をどのように個別の1行の命令に分解するかを説明しようとすると(まっすぐな面で難しい)、彼が先に進んだ場合の結果と本質的に同じです。コンパイラを巧みにしようとする代わりに、コードを読みやすくしただけで、コンパイラには何の影響もありませんでした。しかし、私は余談です。
今から1か月か2か月後に3つの例外タイプを追加すると、どれほど読みにくくなりますか?(回答:それは取得たくさん読みにくく)。
主要なポイントの1つは、実際に、私たちが毎日見ているテキストのソースコードをフォーマットすることのほとんどのポイントは、コードの実行時に実際に何が起こっているかを他の人間に本当に明確にすることです。なぜなら、コンパイラーはソースコードをまったく異なるものに変換し、コードのフォーマットスタイルを気にしないからです。したがって、オール・オン・ワンの行も完全に最悪です。
ただ言って...
// super sucks...
catch( Exception ex )
{
if ( ex is FormatException || ex is OverflowException || ex is ArgumentNullException )
{
// write to a log, whatever...
return;
}
throw;
}