2010-03-03 13 views
8

Estoy pidiendo esto por curiosidad en lugar de debido a una necesidad real de saber, pero no puedo pensar en ninguna buena razón para MethodInfo.Invoke para ajustar sus excepciones.¿Por qué MethodInfo.Invoke ajusta excepciones en una TargetInvocationException?

Si dejamos que se envíen sin abrir, depurar tales excepciones en Visual Studio sería un poco más fácil: no tendría que pedirle a VS que se detenga en las excepciones de primera oportunidad para ver el estado actual en el origen de la excepción . La traza de la pila presumiblemente mostraría [código externo] justo después de la llamada al Invoke, pero ¿y qué?

¿Falto alguna función importante que este ajuste proporciona que no sería posible si Invoke dejaran pasar las excepciones sin envolver?

+1

Si desea invocar un método de forma dinámica sin tener envueltas las excepciones, encontré la forma de hacerlo y escribí en el blog al respecto. http://timwi.blog.com/2010/03/12/dynamic-invoke/ – Timwi

Respuesta

9

Me estoy perdiendo de alguna función importante que este envase ofrece eso no ser posible dejar que había invocación excepciones pasan sin envolver?

Sí. Un argumento es poder distinguir entre el lanzamiento de excepción por el método de destino y la excepción lanzada por el propio mecanismo de reflexión. Ex. el ArgumentException puede arrojarse desde el mecanismo de reflexión o el método de destino; estos son dos meta-niveles diferentes.

Otro argumento es el contrato del método en sí invoke. En Java, el método invoke solo arroja la excepción declarada en la firma del método. La excepción arbitraria simplemente no obedecería a la firma y luego tendría que ser envuelta. Este argumento no es válido para C# como es, pero sigue siendo válido. El método invoke tiene un contrato definido en el documento en el que no puede confiar, si se lanza una excepción de destino como está.

+4

Su primer argumento es un poco crudo. Esto significaría que todos los métodos deberían incluir excepciones provenientes de llamadas a otros métodos para distinguirlos. Existen mecanismos para ver de dónde viene la excepción: si Invoke arroja, la pila rastrea puntos en código M $. Además, el tipo de excepción da una pista. – mmmmmmmm

-1

Si hay una situación en la que la excepción TargetInvocationException se puede lanzar sin el lanzamiento del método invocado y la excepción, tiene sentido. No estoy seguro de si hay tal caso.

Cuestiones relacionadas