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


Tengo un código que está usando reflexión para extraer valores de propiedad de un objeto. En algunos casos, las propiedades pueden lanzar 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 última instancia, el código funciona correctamente, sin embargo, cuando estoy ejecutando bajo el depurador:

Cuando la propiedad lanza una excepción, el IDE cae en el depurador como si la excepción no hubiera sido capturada. Si acabo de golpear ejecutar, el programa fluye a través y la excepción sale como un TargetInvocationException con la excepción real en la propiedad InnerException.

¿Cómo puedo evitar que esto suceda?

Author: Peter Mortensen, 2010-04-17

2 answers

Esto parece ser "por diseño". Lo que pasa es que es muy probable que tengas menú HerramientasOpcionesla DepuraciónGeneralHabilitar Sólo Mi Código habilitado.

As Cómo: Romper en Excepciones no controladas por el usuario estados:

La depuración El diálogo Exceptions muestra una columna adicional (Se rompe cuando una excepción no está controlada por el usuario) cuando "Habilitar solo mi código" está activado.

Esencialmente esto significa que cuando la excepción está dejando el límite de su código (y en este caso, cae hasta el código de reflexión de.NET framework), Visual Studio se rompe porque piensa que la excepción ha dejado el código de usuario. No sabe que volverá al código de usuario más tarde en la pila.

Por Lo tanto, hay dos soluciones: Deshabilitar Sólo Mi Código en el menú HerramientasOpcionesla DepuraciónGeneral o Quitar la marca de verificación cuadro de las excepciones de. NET Framework no controladas por el usuario en el menú DepurarDiálogo Excepciones.

 29
Author: Kirill Osenkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-22 19:51:00

EDITAR: Acabo de probar esto yo mismo, y parece que la reflexión se trata de manera ligeramente diferente. Es posible que desee pensar en una llamada de reflexión como el inicio de un nuevo nivel de "manejado" en lo que respecta al depurador: nada está capturando esa excepción antes de que se traduzca y se vuelva a transformar como TargetInvocationException, por lo que se rompe en. No se si hay alguna manera de inhibir eso, pero ¿sucede muy a menudo? Si realiza regularmente muchas operaciones que resultan en excepciones, es posible que quiero reconsiderar su diseño.


Respuesta original

Vaya a Debug / Exceptions... y ver cuáles son los ajustes. Verás este comportamiento si TargetInvocationException (o cualquier cosa superior en la jerarquía) tiene marcada la casilla "Lanzado".

 4
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-17 15:36:03