catch
同じブロックで複数の例外をキャッチすることは可能ですか?
try
{ }
catch(XamlException s | ArgumentException a)
{ }
catch
同じブロックで複数の例外をキャッチすることは可能ですか?
try
{ }
catch(XamlException s | ArgumentException a)
{ }
はい。スーパークラスをキャッチすると、すべてのサブクラスもキャッチされます。
try
{
// Some code
}
catch(Exception e)
{
// ...
}
これが必要以上にキャッチする場合は、タイプをテストすることで、キャッチするつもりのなかった例外を再スローできます。これを行う場合は、 ではなくthrow;
構文を使用するように注意してください。後者の構文は、スタックトレース情報を破壊します。 throw e;
ただし、提案する構文を使用して 2 つの異なる型をキャッチすることはできません。
あなたが求めているほど簡潔ではありません。1 つの方法は、すべての例外をキャッチし、それら 2 つを特別に処理することです。
catch(Exception e)
{
if((e is SystemException) || (e is ArgumentException))
// handle, rethrow, etc.
else
throw;
}
ただし、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..... }
}
vb.net では、それをキャッチするかどうかを調べて決定する任意の関数がCatch Ex As Exception When IsMyException(Ex)
どこにあるかを言うことができます。キャッチするかどうかの決定は、内部ブロックが実行される前に行われます。残念ながら、C# の作成者は、カスタム例外フィルターを許可するという考えを好んでいません。おそらく、プラットフォーム固有の詳細で言語が汚染されるためです (ほとんどのプラットフォームは .net スタイルの例外フィルターをサポートできませんでした)。したがって、C# で期待できる最善の方法は、次のようなことです。IsMyException
Ex
Ex
Finally
void HandleThisOrThatException(BaseTypeOfThisThatTheOtherException) { ... } ... // ThisException または ThatException をキャッチしますが、TheOtherException はキャッチしません catch (ThisException ex) {HandleThisOrThatException(ex);} catch (ThatException ex) {HandleThisOrThatException(ex);}
ArgumentException
anyも であるため、これは悪い例です。したがって、すべてSystemException
の s をキャッチすると、暗黙的にs も取得されます。 SystemException
ArgumentException