UnhandledExceptionEventArgs.ExceptionObject neden bir Exception değil, bir nesne?


127

Neden UnhandledExceptionEventArgs.ExceptionObjectbir nesne değil de bir nesne Exception?

Ekliyorum AppDomain.UnhandledException.

Ben döküm istiyorum UnhandledExceptionEventArgs.ExceptionObjectbir etmek Exceptionve onu interogate.

Ve bunu akılda tutarak hiç boş kalacak mı?

MSDN belgelerine exatly yararlı değildir.

İşlenmeyen istisna nesnesini alır.

Yanıtlar:


149

Bu, Exception'a yazılamaz çünkü .Net'e System.Exception'dan türetilmeyen nesneler atmak mümkündür. Bu, C # veya VB.Net'te mümkün değildir, ancak diğer CLR tabanlı dillerde mümkündür. Bu nedenle, API bu olasılığı desteklemeli ve tip nesnesini kullanmalıdır.

Yani hiçbir zaman boş olmaması gerekirken, aslında bir System.Exception olmayabilir.

Daha fazla ayrıntı için CLI spesifikasyonu bölüm 10.5'e (özellikle CLS kuralı 40) bakın


3
Teşekkürler Jared, cevabınızı ve buraya msdn topluluk içeriğine bir bağlantı ekledim
Simon

Yani C # 'ta Exception' a dönüştürmek sorun olmayacak mı? sağ?
Mubashar

1
@MubasharAhmad, türden türetilmezse sorun olabilir System.Exception. İstisna, CLI uyumlu olmayan bir dilden kaynaklanmış olabilir ve bir System.Int32. CLR'nin daha yeni sürümleri bunu yine de otomatik olarak System.Exceptionsaracaktır, ancak bu devre dışı bırakılabilen bir ayardır
JaredPar

1
@MubasharAhmad 'as' çevirisini kullanmanızı tavsiye ederim, böylece nesnenin Exception tipinden türetilmemesi durumunda, bir istisna atmak yerine döküm varsayılan olarak null olur.
david.barkhuizen

O zaman try-catchblok, İstisna olmayan nesnelerin yakalanmasına neden izin vermiyor?
AgentFire

80

Jared'in daha önce bahsettiğine ek olarak, derlemenize uygulandıysa Exception, .NET Framework 2.0 ve daha yüksek sürümlerde güvenle çevirebilirsiniz RuntimeCompatibilityAttribute(WrapNonExceptionThrows=true)(C # ve VB derleyicileri tarafından otomatik olarak eklenecektir).

Bu özellik uygulandığında, İstisna dışı "istisnalar" içine alınacaktır RuntimeWrappedException.


3
Bilgi için teşekkürler; Bunu manuel olarak idare ediyordum, yani bir istisna oluşturmayı başaramadıysa bir RuntimeWrappedException içine sardım.
Dennis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.