2

catch同じブロックで複数の例外をキャッチすることは可能ですか?

try
{   }
catch(XamlException s | ArgumentException a)
{   }
4

5 に答える 5

7

はい。スーパークラスをキャッチすると、すべてのサブクラスもキャッチされます。

try
{
    // Some code
}
catch(Exception e)
{
    // ...
}

これが必要以上にキャッチする場合は、タイプをテストすることで、キャッチするつもりのなかった例外を再スローできます。これを行う場合は、 ではなくthrow;構文を使用するように注意してください。後者の構文は、スタックトレース情報を破壊します。 throw e;

ただし、提案する構文を使用して 2 つの異なる型をキャッチすることはできません。

于 2012-06-26T16:15:22.093 に答える
3

あなたが求めているほど簡潔ではありません。1 つの方法は、すべての例外をキャッチし、それら 2 つを特別に処理することです。

catch(Exception e)
{   
  if((e is SystemException) || (e is ArgumentException))
     // handle, rethrow, etc.
  else
     throw;
}
于 2012-06-26T16:16:51.347 に答える
2

ただし、C# の第一人者ではありませんが、これはどの oop 言語でも標準です。

    try
    {
        string s = null;
        ProcessString(s);
    }
    // Most specific:
    catch (InvalidCastException e) { out_one(e); }
    catch (ArgumentNullException e) { out_two(e); }

    // Least specific - anything will get caught
    // here as all exceptions derive from this superclass
    catch (Exception e)
    {
        // performance-wise, this would be better off positioned as
        // a catch block of its own, calling a function (not forking an if)
        if((e is SystemException) { out_two(); }
        else { System..... }
    }
于 2012-06-26T16:30:12.897 に答える
1

vb.net では、それをキャッチするかどうかを調べて決定する任意の関数がCatch Ex As Exception When IsMyException(Ex)どこにあるかを言うことができます。キャッチするかどうかの決定は、内部ブロックが実行される前に行われます。残念ながら、C# の作成者は、カスタム例外フィルターを許可するという考えを好んでいません。おそらく、プラットフォーム固有の詳細で言語が汚染されるためです (ほとんどのプラットフォームは .net スタイルの例外フィルターをサポートできませんでした)。したがって、C# で期待できる最善の方法は、次のようなことです。IsMyExceptionExExFinally

void HandleThisOrThatException(BaseTypeOfThisThatTheOtherException)
{ ... }

...
// ThisException または ThatException をキャッチしますが、TheOtherException はキャッチしません
  catch (ThisException ex) {HandleThisOrThatException(ex);}
  catch (ThatException ex) {HandleThisOrThatException(ex);}
于 2012-06-26T18:56:26.117 に答える
0

ArgumentExceptionanyも であるため、これは悪い例です。したがって、すべてSystemExceptionの s をキャッチすると、暗黙的にs も取得されます。 SystemExceptionArgumentException

于 2012-06-26T16:18:41.830 に答える