ver más abajo para una explicación de lo que está pasando.NET excepción capturada es inesperadamente nula
Tengo un problema muy raro que la excepción capturada es nulo.
El código usa MEF e intenta informar los errores de composición. Utilizando el depurador puedo ver que se lanza la excepción (un InvalidOperationException
), pero cuando es capturado por el último bloque catch en el código a continuación, la variable ex
es nula. Esto es cierto tanto en el depurador como en la ejecución del código normalmente.
static T ResolveWithErrorHandling<T>() where T : class
{
try
{
IocContainer.Compose(Settings.Default.IocConfiguration);
return IocContainer.Resolve<T>();
}
catch (ReflectionTypeLoadException ex)
{
// ... special error reporting for ReflectionTypeLoadException
}
catch (Exception ex)
{
// ex is null - that should not be possible!
// ... general error reporting for other exception types
}
return null;
}
El código que he sustituido por comentarios es realmente un código simple para formatear el mensaje de error. Nada extraño sucediendo allí.
he tratado de alterar el código para descubrir qué efecto que podría tener:
- Si quito el primer bloque catch (
ReflectionTypeLoadException
) la excepción detectada en el bloque catch última ya no es nula. - Si capturo otro tipo de excepción en el primer bloque catch, la excepción capturada en el bloque catch final ya no es nula.
- Si agrego un bloque catch para
InvalidOperationException
como primer bloque catch, la excepción capturada en ese bloque no es nula. - Si agrego un bloque catch para
InvalidOperationException
entre los dos bloques catch la excepción capturada en ese bloque es nula.
El proyecto usa Code Contracts y el código generado por el compilador se procesa posteriormente para verificar los contratos. Lamentablemente, no he encontrado una manera de deshacerme de esto para fines de prueba sin realizar una cirugía mayor en el proyecto.
Mi solución actual es no capturar ReflectionTypeLoadException
y en su lugar ramificar en el tipo de ex
en el controlador de excepción general.
¿Cuál podría ser la explicación de este comportamiento "imposible"? ¿Qué pasa con ReflectionTypeLoadException
catch block?
Embarazosamente la excepción no es nulo y no puede ser nulo por el estándar de C# 15.9.5.
Sin embargo, utilizando Contratos de código en un proyecto can mess up the display of local variables in the debugger porque el código IL generado por el compilador puede reescribirse por Contratos de código para que la IL final esté ligeramente desincronizada con la información de depuración. En mi caso, la variable ex
se muestra como nula, incluso no lo es. La desafortunada naturaleza de los informes de errores que tenían lugar justo antes de la finalización de la aplicación significaba que creía que el informe de errores no se debía a que ex
era nulo y ex.Message
arrojaba un NullReferenceException
dentro de mi bloque catch. Usando el depurador pude "verificar" que ex
era nulo, excepto que en realidad no era nulo.
Mi confusión se agravó por el hecho de que un bloque catch para ReflectionTypeLoadException
parece afectar el problema de visualización del depurador.
Gracias a todos los que respondieron.
¿Hay realmente una 'ReflectionTypeLoadException' en cualquier lugar? – Jaymz
Solo una nota, pero ¿puedes manejar los diferentes tipos de excepción o solo informas lo mismo para cada uno? Si se trata de informes genéricos y no se puede 'manipular' la excepción, entonces no estoy seguro de que deba analizar las capturas de todos modos. –
¿Qué sucede cuando agrega un catch para InvalidOperationExecption? –