web-dev-qa-db-ja.com

複数のキャッチブロックよりもエレガントな例外処理?

C#を使用すると、大量のいキャッチブロックではなく、複数のタイプの例外を処理するより良い方法がありますか?

この種の状況のベストプラクティスと考えられるものは何ですか?

例えば:

try
{
    // Many types of exceptions can be thrown
}
catch (CustomException ce)
{
    ...
}
catch (AnotherCustomException ace)
{
    ...
}
catch (Exception ex)
{
    ...
}
45
Aaron

私の意見では、たくさんの「ugい」キャッチブロックISはその状況を処理する最良の方法です。

私がこれを好む理由は、それが非常に明確であることです。どの例外を処理し、どのように処理する必要があるかを明示的に示しています。処理をより簡潔な形式にマージしようとする他の形式は、ほとんどの場合可読性を失います。

私のアドバイスはこれに固執し、明示的に処理したい例外を、それぞれ独自のcatchブロックで処理することです。

70
Reed Copsey

私はリードに同意します。これが最良のアプローチです。

これらのコメントを追加します。

あなたが何かをしようとしているものだけをキャッチします。問題を解決できない場合、特定の例外をキャッチしても意味がありません。

Catchブロックの使用を無理にしないでください。例外を解決できない多くの場合、例外を中央のポイント(Page_Errorなど)までバブルさせてキャッチするのが最善です。次に、例外をログに記録し、ユーザーにメッセージを表示します。

21
DOK

他にできることは、VB.NETの例外フィルターをエミュレートすることだけです。

try {
    DoSomething();
} catch (Exception e) {
    if (!ex is CustomException && !ex is AnotherCustomException) {
       throw;
    }
    // handle
}

時々これは良いこともあれば、そうでないこともあります。ハンドラーに必要な共通ロジックがある場合は主に使用しますが、例外は基本型を共有しません。

15
Mark Brackett

残念ながら、 C#にはユーザー例外フィルターはありません VB.NETのように、以下に制限されています:

  1. すべての例外の共通の祖先をキャッチします。あなたがキャッチしたくない他の子孫の例外タイプがあるかもしれないので、これはあなたが望むものかもしれませんし、そうでないかもしれません。
  2. 例外処理ロジックを別のメソッドに移動し、各ハンドラーから呼び出します。
  3. ハンドラーごとに例外ロジックを繰り返します。
  4. 例外処理ロジックを、VB.NETなどのフィルターをサポートする言語に移動します。
10
Kent Boogaart

このような本当に大量のコードを書く必要がある場合、 [〜#〜] aop [〜#〜] フレームワークをチェックすることをお勧めします。私は個人的に PostSharp を使用しています。次に、すべての例外処理コードをアスペクトに隠すことができます。

5
user94636

Enterprise Library Exception Handling block をチェックアウトする必要があります。ポリシー(ラッピングポリシー、伝播ポリシー、置換ポリシー、ロギングポリシーなど)を使用して例外をより詳細に制御できます。特定のタイプの例外。

2
JP Alioto

この方法は良くないですか?

1つの例外のみを処理する場合:

try
{
    // Many types of exceptions can be thrown
}
catch (TheExceptionIWantToHandle ex)
{
    // handle it
}
catch (Exception ex)
{
    // suppress all other exceptions
}

1つを除くすべての例外を処理する場合:

try
{
    // Many types of exceptions can be thrown
}
catch (TheExceptionIDoNotWantToHandle ex)
{
    // suppress all other exceptions
}
catch (Exception ex)
{
    // handle it
}

いいじゃない?

0
stanleyxu2005