これは少し抽象的ですが、例外をスローして複数のキャッチブロックに入力させる方法はありますか?たとえば、特定の例外とそれに続く非特定の例外に一致する場合です。
catch(Arithmetic exception)
{
//do stuff
}
catch(Exception exception)
{
//do stuff
}
異なるタイプの複数のキャッチブロックを持つことは完全に許容されます。ただし、動作は、最初の候補ブロックが例外を処理することです。
両方のキャッチブロックには入りません。例外タイプに一致する最初のcatchブロックは、その特定の例外を処理し、ハンドラーで再スローされた場合でも、他の例外は処理しません。例外がcatchブロックに入ると、後続の例外はスキップされます。
両方のブロックで例外をキャッチするには、次のようにブロックをネストする必要があります。
try
{
try
{
// Do something that throws ArithmeticException
}
catch(ArithmeticException arithException)
{
// This handles the thrown exception....
throw; // Rethrow so the outer handler sees it too
}
}
catch (Exception e)
{
// This gets hit as well, now, since the "inner" block rethrew the exception
}
または、特定の種類の例外に基づいて、汎用の例外ハンドラーでフィルター処理することもできます。
いいえ。1つの例外に対して両方のcatchブロックでコードを実行することはできません。
おそらく、汎用例外ブロックのコードを、どちらからでも呼び出すことができるものにリファクタリングします。
try
{
// blah blah blah
{
catch(Arithmetic ae)
{
HandleArithmeticException( ae );
HandleGenericException( ae );
}
catch(Exception e)
{
HandleGenericException( e );
}
他の人が言ったように、例外は最も具体的なキャッチブロックによってキャッチされます。
これは、例外処理を除いて、私の欲求不満を引き起こします。私はあなたが次のようなことをすることができればいいのに
catch (ArgumentNullExcpetion, ArugmentOutOfRangeException ex)
{
}
する代わりに
catch (ArgumentNullExcpetion e)
{
}
catch (ArugmentOutOfRangeException outOfRange)
{
}
私はあなたがおそらく異なる例外に対して異なることをするというこれに対する理由を理解していますが、時々私はそれらを組み合わせたいと思います。
複数の例外ブロックに同じ例外を処理させることはできません。しかし、canは、一般的な例外をキャッチしてから、次のように、より具体的なものにキャストしようとします。
catch (Exception exception)
{
var aex = exception as ArithmeticException
if (aex != null)
{
// do stuff specific to this exception type
}
// then do general stuff
}
VB.NETを使用している場合は、算術例外のエラーハンドラーを、常にfalseを返す関数またはメソッド呼び出しに抽象化できます。
次に、次のように書くことができます。
Catch ex as Arithmetic When HandleArithmetic()
Catch ex as Exception
End Try
以前にロギングの目的で推奨されているのを見たことがありますが、そのような使用法を推奨するわけではありません。 C#に相当するものはないと思います。