¿Por qué UnhandledExceptionEventArgs.ExceptionObject es un objeto y no una excepción?

125

¿Por qué es UnhandledExceptionEventArgs.ExceptionObjectun objeto y no un Exception?

Me estoy apegando a AppDomain.UnhandledException.

Me gustaría echar UnhandledExceptionEventArgs.ExceptionObjectun Exceptione interogarlo.

Y con esto en mente, ¿alguna vez será nulo?

La documentación de MSDN no es muy útil.

Obtiene el objeto de excepción no controlado.

Simón
fuente

Respuestas:

147

Esto no se puede escribir en Exception porque es posible lanzar objetos en .Net que no se derivan de System.Exception. Esto no es posible en C # o VB.Net pero es posible en otros lenguajes basados ​​en CLR. Por lo tanto, la API debe admitir esta posibilidad y utiliza el objeto type.

Entonces, aunque nunca debería ser nulo, de hecho no puede ser un System.Exception.

Consulte la sección 10.5 de especificaciones de CLI (específicamente la regla 40 de CLS) para obtener más detalles.

JaredPar
fuente
3
Gracias Jared I han añadido su respuesta y un enlace de vuelta aquí para el contenido de la comunidad MSDN
Simon
¿Entonces lanzarlo a Exception en C # no será un problema? ¿Derecha?
Mubashar
1
@MubasharAhmad puede ser un problema si el tipo no se deriva System.Exception. La excepción podría haber sido el resultado de un lenguaje no compatible con CLI que decide lanzar un System.Int32. Las versiones más nuevas del CLR lo ajustarán automáticamente de System.Exceptiontodos modos, pero esta es una configuración que se puede deshabilitar
JaredPar
1
@MubasharAhmad Le recomendaría que use el elenco 'como', de modo que en el caso de que el objeto no se derive del tipo Excepción, el elenco por defecto sea nulo, en lugar de lanzar una excepción.
david.barkhuizen
¿Por qué entonces el try-catchbloque no permite atrapar objetos que no son de excepción?
AgentFire
78

Además de lo que Jared ya mencionó, puede transmitir de forma segura Exceptionen .NET Framework 2.0 y versiones posteriores si RuntimeCompatibilityAttribute(WrapNonExceptionThrows=true)se ha aplicado a su ensamblaje (los compiladores de C # y VB lo agregarán automáticamente).

Cuando se ha aplicado este atributo, se incluirán "excepciones" que no sean de excepción RuntimeWrappedException.

Nicole Calinoiu
fuente
3
Gracias por la información; Estaba manejando esto manualmente, es decir, lo envolví en una RuntimeWrappedException si no podía emitir una excepción.
Dennis