Mengapa UnhandledExceptionEventArgs.ExceptionObject merupakan objek dan bukan Exception?

126

Mengapa UnhandledExceptionEventArgs.ExceptionObjectsebuah objek dan bukan Exception?

Saya melekat pada AppDomain.UnhandledException.

Saya ingin UnhandledExceptionEventArgs.ExceptionObjectmemasukkan Exceptiondan menginterogasinya.

Dan dengan pemikiran ini, akankah nilainya menjadi nol?

The dokumentasi MSDN tidak exatly berguna.

Mendapatkan objek pengecualian yang tidak tertangani.

Simon
sumber

Jawaban:

148

Ini tidak dapat diketik ke Exception karena dimungkinkan untuk melempar objek dalam .Net yang tidak berasal dari System.Exception. Ini tidak mungkin dilakukan di C # atau VB.Net tetapi mungkin dalam bahasa berbasis CLR lainnya. Karenanya API harus mendukung kemungkinan ini dan menggunakan objek tipe.

Jadi meskipun seharusnya tidak pernah nol, itu mungkin sebenarnya bukan System.Exception.

Lihat spesifikasi CLI bagian 10.5 (khususnya aturan CLS 40) untuk detail selengkapnya

JaredPar
sumber
3
Terima kasih Jared Saya telah menambahkan jawaban Anda dan tautan kembali ke sini ke konten komunitas msdn
Simon
Jadi mentransmisikannya ke Exception di C # tidak akan menjadi masalah? Baik?
Mubashar
1
@MubasharAhmad bisa menjadi masalah jika tipenya tidak diturunkan System.Exception. Pengecualian dapat terjadi karena bahasa yang tidak sesuai dengan CLI yang memutuskan untuk melempar System.Int32. Versi CLR yang lebih baru akan membungkusnya secara otomatis, System.Exceptiontetapi ini adalah pengaturan yang dapat dinonaktifkan
JaredPar
1
@MubasharAhmad Saya akan merekomendasikan agar Anda menggunakan 'as' cast, sehingga dalam kasus objek tidak diturunkan dari tipe Exception, default cast ke null, daripada melempar pengecualian.
david.barkhuizen
Lalu mengapa try-catchblok tidak memungkinkan untuk menangkap objek non-pengecualian?
AgentFire
79

Selain apa yang telah disebutkan Jared, Anda dapat mentransmisikan dengan aman ke Exceptiondalam .NET Framework 2.0 dan yang lebih tinggi jika RuntimeCompatibilityAttribute(WrapNonExceptionThrows=true)telah diterapkan ke rakitan Anda (akan ditambahkan secara otomatis oleh kompiler C # dan VB).

Jika atribut ini telah diterapkan, "pengecualian" non-Pengecualian akan disertakan RuntimeWrappedException.

Nicole Calinoiu
sumber
3
Terima kasih untuk informasinya; Saya menangani ini secara manual, yaitu, membungkusnya dalam RuntimeWrappedException jika gagal memberikan pengecualian.
Dennis