我出于好奇而不是因为真正需要知道而这是问这个问题,但我想不出MethodInfo.Invoke
包装其例外的任何充分理由。
如果让它们通过解包,在Visual Studio中调试此类异常会更容易一些 - 我不必要求VS停止第一次机会异常以查看异常源处的当前状态。堆栈跟踪可能会在调用Invoke
之后显示[外部代码],但是那样。
我是否遗漏了这个包装提供的一些重要功能,如果Invoke
允许异常通过解包,那么这是不可能的?
答案 0 :(得分:9)
我错过了一些重要的功能 这个包装提供了那个 Invoke let是不可能的 异常通过解包?
是。一个论点是能够区分目标方法的异常抛出和反射机制本身抛出的异常。防爆。 ArgumentException
可以从反射机制或抛出目标方法 - 这是两个不同的元级别。
另一个论点是invoke
方法本身的合约。在Java中,允许invoke
方法仅抛出方法签名中声明的异常。任意例外根本不遵守签名,然后需要包装。这个参数不适用于C#,但仍然有效。如果按原样抛出目标异常,则invoke
方法在doc中定义了一个您无法依赖的契约。
答案 1 :(得分:-1)
如果存在某种情况,可以抛出TargetInvocationException而没有调用方法throw和exception,这是有道理的。我不确定是否有这种情况。