9

コードを再利用する理由から、次のコードの catch ブロックをマージしたいと考えています。

try
{
    DoSomeInputOutput();
}
catch (InvalidOperationException ex)
{
    HandleKnownException1(ex);
}
catch (InvalidDataException ex)
{
    HandleKnownException1(ex);
}
catch (ArgumentNullException ex)
{
    HandleKnownException1(ex);
}
catch (ArgumentOutOfRangeException ex)
{
    HandleKnownException2(ex);
}
catch (ArithmeticException ex)
{
    HandleKnownException2(ex);
}
catch (InvalidCastException ex)
{
    HandleKnownException2(ex);
}
catch (Exception ex)
{
    HandleUnknownException(ex);
}

このようなものに:

try
{
    DoSomeInputOutput();
}
catch (InvalidOperationException ex)
catch (InvalidDataException ex)
catch (ArgumentNullException ex)
{
    HandleKnownException1(ex);
}
catch (ArgumentOutOfRangeException ex)
catch (ArithmeticException ex)
catch (InvalidCastException ex)
{
    HandleKnownException2(ex);
}
catch (Exception ex)
{
    HandleUnknownException(ex);
}

それはどういうわけか可能ですか?

ありがとう。

4

3 に答える 3

7

おそらく、複数の場所でそれを行うでしょう。もしそうなら、なぜあなたはこれをしないのですか:

{
    DoSomeInputOutput();
}
catch (Exception ex)
{
    HandleInputException(ex);
}

void HandleInputException(Exception ex)
{
   if (ex is InvalidOperationException || ex is InvalidDataException || ex is ArgumentNullException)
   {
     HandleKnownException1 (ex);
   }
   else if ...
   else if ...
}
于 2009-12-12T12:32:18.197 に答える
5

いいえ(または少なくとも、グループ化する例外がそのグループに固有の共通の基本クラスを共有しない限り、そうではありません)このシナリオでできることは、 でcatch (Exception ex)実行時テストを行うことだけですex。あなたがそれを行う頃には、あなたのコードはそのままの状態で既に「きれい」になっていると思います (重要なのは、処理コードをメソッドにリファクタリングしているためです)。

重要なコードに集中できるように、間隔を微調整したくなるでしょう。

try
{
    DoSomeInputOutput();
}
// blah humorous scenario 1
catch (InvalidOperationException ex) { HandleKnownException1(ex); }
catch (InvalidDataException ex) { HandleKnownException1(ex); }
catch (ArgumentNullException ex) { HandleKnownException1(ex); }
// blah whimsical scenario 2
catch (ArgumentOutOfRangeException ex) { HandleKnownException2(ex); }
catch (ArithmeticException ex) { HandleKnownException2(ex); }
catch (InvalidCastException ex) { HandleKnownException2(ex); }
// unexpected comedy
catch (Exception ex) { HandleUnknownException(ex); }

(か何か)。

いくつかの点で、これは次の質問とも関連しています: switch / pattern matching idea

于 2009-12-12T12:08:00.323 に答える
1

例外の適切な階層がある場合にのみ、このようなことを行うことができます。その後、階層の上位にあるタイプの例外をキャッチできます。ただし、例外階層は設計上かなり浅いことを意図しており、階層のみに基づいて同じ方法で例外を処理する必要があるという保証はありません。それに加えて...あなたの例で使用されている標準の例外タイプでは、そのどれも役に立ちません。

于 2009-12-12T12:15:45.583 に答える