¿Por qué TargetInvocationException es tratado como no capturado por el IDE?

Tengo un código que usa la reflexión para extraer valores de propiedades de un objeto. En algunos casos, las propiedades pueden arrojar excepciones, porque tienen referencias nulas, etc.

object result; try { result = propertyInfo.GetValue(target, null); } catch (TargetInvocationException ex) { result = ex.InnerException.Message; } catch (Exception ex) { result = ex.Message; } 

En definitiva, el código funciona correctamente, sin embargo, cuando estoy ejecutando bajo el depurador:

Cuando la propiedad arroja una excepción, el IDE cae en el depurador como si la excepción no hubiera sido detectada. Si pulso ejecutar, el progtwig fluye y la excepción aparece como una excepción de invocación de destino con la excepción real en la propiedad InnerException.

¿Cómo puedo evitar que esto suceda?

Esto parece ser “por diseño”. Lo que sucede es que es probable que tenga el menú HerramientasOpcionesDepuraciónGeneralHabilitar solo mi código habilitado.

Como se describe: Cómo romper las excepciones de usuario no controladas :

El cuadro de diálogo DepurarExcepciones muestra una columna adicional (Descanso cuando una excepción no es controlada por el usuario) cuando está habilitada “Habilitar solo mi código”.

Básicamente, esto significa que cuando la excepción deja el límite de su código (y en este caso, se reduce al código de reflexión de .NET Framework), Visual Studio se rompe porque cree que la excepción ha salido del código de usuario. No sabe que volverá al código de usuario más adelante en la stack.

Por lo tanto, hay dos soluciones: deshabilitar Just My Code en el menú HerramientasOpcionesDepuraciónGeneral o Eliminar la checkbox de las excepciones .NET Framework no controladas por el usuario en el menú DepuraciónDiálogo de excepciones .

EDITAR: Acabo de probar esto por mí mismo, y parece que la reflexión se trata de forma ligeramente diferente. Es posible que desee considerar una llamada de reflexión como el inicio de un nuevo nivel de “gestión” en lo que respecta al depurador: nada atrapa esa excepción antes de que se traduzca y vuelva a crear como una TargetInvocationException , por lo que interrumpe. No lo hago saber si hay alguna forma de nhibernate eso, pero ¿sucede muy a menudo? Si realiza regularmente muchas operaciones que generan excepciones, puede reconsiderar su diseño.


Respuesta original

Vaya a Depurar / Excepciones … y vea cuáles son las configuraciones. Verá este comportamiento si TargetInvocationException (o algo superior en la jerarquía) tiene marcada la checkbox “Lanzada”.