C#を使用すると、大量のいキャッチブロックではなく、複数のタイプの例外を処理するより良い方法がありますか?
この種の状況のベストプラクティスと考えられるものは何ですか?
例えば:
try
{
// Many types of exceptions can be thrown
}
catch (CustomException ce)
{
...
}
catch (AnotherCustomException ace)
{
...
}
catch (Exception ex)
{
...
}
私の意見では、たくさんの「ugい」キャッチブロックISはその状況を処理する最良の方法です。
私がこれを好む理由は、それが非常に明確であることです。どの例外を処理し、どのように処理する必要があるかを明示的に示しています。処理をより簡潔な形式にマージしようとする他の形式は、ほとんどの場合可読性を失います。
私のアドバイスはこれに固執し、明示的に処理したい例外を、それぞれ独自のcatchブロックで処理することです。
私はリードに同意します。これが最良のアプローチです。
これらのコメントを追加します。
あなたが何かをしようとしているものだけをキャッチします。問題を解決できない場合、特定の例外をキャッチしても意味がありません。
Catchブロックの使用を無理にしないでください。例外を解決できない多くの場合、例外を中央のポイント(Page_Errorなど)までバブルさせてキャッチするのが最善です。次に、例外をログに記録し、ユーザーにメッセージを表示します。
他にできることは、VB.NETの例外フィルターをエミュレートすることだけです。
try {
DoSomething();
} catch (Exception e) {
if (!ex is CustomException && !ex is AnotherCustomException) {
throw;
}
// handle
}
時々これは良いこともあれば、そうでないこともあります。ハンドラーに必要な共通ロジックがある場合は主に使用しますが、例外は基本型を共有しません。
残念ながら、 C#にはユーザー例外フィルターはありません VB.NETのように、以下に制限されています:
このような本当に大量のコードを書く必要がある場合、 [〜#〜] aop [〜#〜] フレームワークをチェックすることをお勧めします。私は個人的に PostSharp を使用しています。次に、すべての例外処理コードをアスペクトに隠すことができます。
Enterprise Library Exception Handling block をチェックアウトする必要があります。ポリシー(ラッピングポリシー、伝播ポリシー、置換ポリシー、ロギングポリシーなど)を使用して例外をより詳細に制御できます。特定のタイプの例外。
この方法は良くないですか?
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
}
いいじゃない?