2011-11-07 17 views
7

Al llamar a un método a través de methodInfo.Invoke, si se lanza una excepción, no parece propagarse a mis catch blocks.Excepciones que no se propagan desde una llamada a un método reflejado en C#

object value; 
try 
{ 
    value = myMethod.Invoke(null, parameters);//program crashes with uncaught exception 
} 
catch 
{ 
    throw new Exception("Caught!");//never executed 
} 

La excepción particular, este método está levantando es KeyNotFoundException, pero eso no debería importar porque yo estoy poniendo todo lo ¿verdad?

El mensaje de error en particular que recibo de Visual Studio es

KeyNotFoundException was unhandled by user code 

mientras que normalmente el mensaje decía

KeyNotFoundException was unhandled 

si la llamada no era una invocación reflejada.

Podría simplemente hacer que el método verifique si la clave está allí, y si no devuelve nulo, pero parece preferible utilizar el manejo de excepciones. ¿Hay alguna forma de propagar excepciones desde una llamada a un método reflejado?

+0

¿Qué es myMethod? –

+0

Hola Lucina, acabo de secuestrar esta publicación para hacerte saber que en TeX.SX, generalmente es mejor auto-responder que eliminar [tu pregunta] (http://tex.stackexchange.com/q/255629/ 17423). Tenía mucha curiosidad sobre cómo se vería el tipo de letra kaomoji de TeX :) y estoy seguro de que otros también lo estaban. Eliminaré este comentario en un día o más (o tan pronto como me haga saber que lo ha visto). Solo quería informarle. :) –

Respuesta

3

Esto podría ser un problema con el depurador de Visual Studio también. Como se señala en la respuesta aceptada a esta pregunta similar here, hay algunas soluciones que puede hacer. La más simple de las cuales es cambiar su depurador de Visual Studio para desactivar "Just My Code" en Herramientas -> Opciones -> Depuración -> General. También puede envolverlo en un delegado o intentar capturar explícitamente la excepción de invocación e inspeccionar la excepción interna de eso, que debería ser su KeyNotFoundException.

+1

Re el último - si no 'catch {}', entonces tampoco 'catch (TargetInvocationException) {}' –

1

Si se produce un error durante un método invocado con reflexión, debe arrojar un TargetInvocationException que envuelve (a través de .InnerException) el original. Sin embargo, existen algunos métodos que podrían causar más fallas en el terminal, como algunos métodos en torno a la creación de winform/el ciclo de mensajes.

También es posible que el método es de trabajo, pero está causando un trabajo adicional a suceder en otro hilo, y es que que está fallando. Esto mataría el hilo, y no puedes atraparlo ya que no está en tu hilo. Esto sería particularmente probable si su código está realmente en un hilo de trabajo.

3

funciona para mí:

using System; 
using System.Reflection; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var method = typeof(Program).GetMethod("ThrowException"); 
     try 
     { 
      method.Invoke(null, null); 
     } 
     catch (TargetInvocationException e) 
     { 
      Console.WriteLine("Caught exception: {0}", e.InnerException); 
     } 
    } 

    public static void ThrowException() 
    { 
     throw new Exception("Bang!"); 
    } 
} 

importante hacer notar que necesita coger TargetInvocationException que es la excepción lanzada directamente por Method.Invoke, envolviendo la excepción lanzada por el propio método.

¿Se te ocurre un programa corto pero completo similar que demuestra el problema?

Cuestiones relacionadas