UnhandledExceptionEventArgs.ExceptionObjectが例外ではなくオブジェクトであるのはなぜですか?


125

なぜUnhandledExceptionEventArgs.ExceptionObjectオブジェクトであり、ではないのExceptionですか?

につけていAppDomain.UnhandledExceptionます。

にキャストUnhandledExceptionEventArgs.ExceptionObjectしてException質問します。

そしてこれを念頭に置いて、それはヌルになるでしょうか?

MSDNのドキュメントは exatly有用ではありません。

未処理の例外オブジェクトを取得します。

回答:


147

System.Exceptionから派生していない.Netのオブジェクトをスローする可能性があるため、これをExceptionに入力することはできません。これはC#またはVB.Netでは不可能ですが、他のCLRベースの言語では可能です。したがって、APIはこの可能性をサポートし、タイプオブジェクトを使用する必要があります。

そのため、nullにすることはできませんが、実際にはSystem.Exceptionではない場合があります。

詳細については、CLI仕様のセクション10.5(特にCLSルール40)を参照してください。


3
ありがとうJared私はあなたの答えとここにmsdnコミュニティコンテンツへのリンクを追加しました
Simon

C#でExceptionにキャストしても問題ないでしょうか?正しい?
Mubashar 2013年

1
@MubasharAhmadタイプがから派生していない場合、問題になる可能性がありSystem.Exceptionます。例外は、CLIに準拠していない言語がをスローすることにしたために発生した可能性がありますSystem.Int32。新しいバージョンのCLRはこれを自動ラップしますSystem.Exceptionが、これは無効にできる設定です
JaredPar

1
@MubasharAhmad 'as'キャストを使用することをお勧めします。これにより、オブジェクトがException型から派生していない場合、例外をスローするのではなく、キャストのデフォルトはnullになります。
david.barkhuizen 2016

なぜtry-catchブロックは非例外オブジェクトをキャッチすることを許可しないのですか?
AgentFire

78

Jaredがすでに述べたことに加えてException、.NET Framework 2.0以降で安全にキャストできます。RuntimeCompatibilityAttribute(WrapNonExceptionThrows=true)加えて、アセンブリに適用されてます(C#およびVBコンパイラによって自動的に追加されます)。

この属性が適用されると、例外以外の「例外」はでラップされRuntimeWrappedExceptionます。


3
情報ありがとうございました; これを手動で処理していました。つまり、例外のキャストに失敗した場合は、RuntimeWrappedExceptionでラップしていました。
デニス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.