为什么MethodInfo.Invoke在TargetInvocationException中包装异常?

时间:2010-03-03 12:04:16

标签: .net reflection

我出于好奇而不是因为真正需要知道而这是问这个问题,但我想不出MethodInfo.Invoke包装其例外的任何充分理由。

如果让它们通过解包,在Visual Studio中调试此类异常会更容易一些 - 我不必要求VS停止第一次机会异常以查看异常源处的当前状态。堆栈跟踪可能会在调用Invoke之后显示[外部代码],但是那样。

我是否遗漏了这个包装提供的一些重要功能,如果Invoke允许异常通过解包,那么这是不可能的?

2 个答案:

答案 0 :(得分:9)

  

我错过了一些重要的功能   这个包装提供了那个   Invoke let是不可能的   异常通过解包?

是。一个论点是能够区分目标方法的异常抛出和反射机制本身抛出的异常。防爆。 ArgumentException可以从反射机制抛出目标方法 - 这是两个不同的元级别。

另一个论点是invoke方法本身的合约。在Java中,允许invoke方法仅抛出方法签名中声明的异常。任意例外根本不遵守签名,然后需要包装。这个参数不适用于C#,但仍然有效。如果按原样抛出目标异常,则invoke方法在doc中定义了一个您无法依赖的契约。

答案 1 :(得分:-1)

如果存在某种情况,可以抛出TargetInvocationException而没有调用方法throw和exception,这是有道理的。我不确定是否有这种情况。