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.

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


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.


3
Terima kasih untuk informasinya; Saya menangani ini secara manual, yaitu, membungkusnya dalam RuntimeWrappedException jika gagal memberikan pengecualian.
Dennis
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.