2010-06-16 9 views
21

Actualización: que haya presentado un informe de error en Microsoft Connect: https://connect.microsoft.com/VisualStudio/feedback/details/568271/debugger-halting-on-exception-thrown-inside-methodinfo-invoke#detailsLa excepción inalcanzable, pt 2

Si puede reproducir este problema en su máquina, por favor upvote el fallo para que pueda ser arreglado!


Ok He hecho algunas pruebas y he reducido el problema a algo muy simple:

i. Cree un método en una nueva clase que arroje una excepción:

public class Class1 { 
    public void CallMe() { 
     string blah = null; 
     blah.ToLower(); 
    } 
} 

ii. Cree un MethodInfo que señale este método en otro lugar:

Type class1 = typeof(Class1); 
Class1 obj = new Class1(); 
MethodInfo method = class1.GetMethod("CallMe"); 

iii. Ajustar una llamada a Invoke() en un bloque try/catch:

try { 
    method.Invoke(obj, null); // exception is not being caught! 
} catch { 
} 

iv. Ejecute el programa sin el depurador (funciona bien).

v. Ahora ejecute el programa con el depurador. El depurador detendrá el programa cuando se produce la excepción, a pesar de que está envuelto en un controlador de captura que intenta ignorarlo. (¡Incluso si coloca un punto de interrupción en el bloque catch, se detendrá antes de alcanzarlo!)

De hecho, la excepción ocurre cuando la ejecuta sin el depurador también. En un proyecto de prueba simple, es ignorado en otro nivel, pero si su aplicación tiene algún tipo de manejo de excepción global, también se desencadenará allí. [ver comentarios]

Esto me está causando un verdadero dolor de cabeza, ya que mantiene la activación de choque controlador de mi aplicación, por no mencionar el dolor que es tratar de depurar.

+7

+1 causa se tomaron el tiempo para reducir esto en un ejemplo sano –

+0

Ver aquí : http://stackoverflow.com/questions/2724703/why-does-vs2010-always-break-on-exception-from-methodinfo-invoke –

+4

¿Ha habilitado la excepción como "detener al lanzar" en Visual Studio? este comportamiento, vaya a Depurar | Excepciones y desmarque detener en tiro. –

Respuesta

5

Puedo reproducir esto en mi .NET 4 box, y tiene razón, solo ocurre en .NET 4.0.

Esto huele mucho como un error para mí, y debería ir a MS Connect. Major bummer si esto está activando su controlador de bloqueo. Parece una forma no agradable de evitar esto, para envolver el método invocado dentro de su propio controlador. :-(

Una cosa que no puedo reproducir, sin embargo, está disparando el manejador de fallos Aquí está mi programa:..

namespace trash { 
    public class Class1 { 
     public void CallMe() { 
      string blah = null; 
      blah.ToLower(); 
     } 
    } 

    class Program { 
     static void Main(string[] args) { 
      AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);   
      var class1 = typeof(Class1); 
      var method = class1.GetMethod("CallMe"); 

      try { 
       var obj = new Class1(); 
       method.Invoke(obj, null); // exception is not being caught! 
      } 
      catch (System.Reflection.TargetInvocationException) { 
       Console.Write("what you would expect"); 
      } 

     } 

     static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { 
      Console.Write("it would be horrible if this got tripped but it doesn't!"); 
     } 
    } 
} 
+0

Todavía no he podido reproducir el controlador de bloqueo tropezando en una aplicación de prueba, sin embargo estoy trabajando en ello. Por alguna razón, mi aplicación real está muriendo muy duro y la excepción (que imprimo en un archivo de registro) se ve muy similar. – devios1

+0

Sin embargo, descubrí algo más interesante: si enlaza una propiedad en WPF que arroja una excepción, el depurador se detendrá allí también cuando lo ejecute, ¡ni siquiera necesita llamar a MethodInfo.Invoke en absoluto! El controlador de bloqueo que se dispara cuando no está en modo de depuración parece ser falso, ya que resulta que era un problema diferente que causaba eso, lo que significa que podría ser un error de VS2010. – devios1

+0

Esta respuesta es el mismo resultado que recibo. Básicamente, hay un catch-all en algún lugar dentro de 'Invoke', algo de lo que creo que ahora se arrepienten seriamente, pero que causa innumerables dolores de cabeza. NÓTESE BIEN. ¡Creo que exactamente cuándo se ejecutará el controlador UnhandledException depende de la versión de Windows! Entonces puede obtener diferentes resultados en XP/Vista/7. Mi prueba está en 7 y el evento UnhandledException nunca se dispara, pero se detiene en el depurador. –

-1

No puede ver todas las excepciones. Hay algunas suposiciones en tu ejemplo. Usted está, por ejemplo, suponiendo que la excepción se planteó en el hilo de llamada. La captura de excepciones no controladas en otros hilos depende de los tiempos de ejecución que esté utilizando (consola, winforms, WPF, ASP.Net, etc.).

Además, las llamadas a System.Environment.FailFast() no generan ninguna condición manejable: el proceso finaliza efectivamente sin posibilidad de intervención.

+0

Está llamando a Invoke(), no a BeginInvoke(), por lo que la llamada ocurre en el hilo actual. Sin embargo, hay un código externo que se interpone entre la llamada y la invocación. –

+0

@Dave, pero eso no garantiza que el método invocado en cuestión no genere otro subproceso. Mi afirmación anterior se cumple. –

+0

@Dave, con eso, quiero decir, el método llamado por 'Invoke', podría a su vez crear un hilo (directa o indirectamente), no quiero decir que' Invoke', en sí mismo, creara arbitrariamente otro hilo. –

Cuestiones relacionadas