.net 为什么MethodInfo.Invoke在TargetInvocationException中调用包裹异常?

.net 为什么MethodInfo.Invoke在TargetInvocationException中调用包裹异常?,.net,reflection,.net,Reflection,我问这个问题是出于好奇,而不是出于真正的需要,但是我想不出任何好的理由来包装它的异常 如果让它们通过unwrapped,那么在VisualStudio中调试此类异常会稍微容易一点——我不必要求VS在第一次出现异常时停止,以查看异常源的当前状态。堆栈跟踪可能会在调用Invoke之后显示[external code],但这又怎么样呢 我是否缺少了此包装提供的一些重要功能,如果Invoke让异常通过unwrapped,这是不可能的?如果有一种情况,可以在没有调用的方法抛出和异常的情况下抛出Target

我问这个问题是出于好奇,而不是出于真正的需要,但是我想不出任何好的理由来包装它的异常

如果让它们通过unwrapped,那么在VisualStudio中调试此类异常会稍微容易一点——我不必要求VS在第一次出现异常时停止,以查看异常源的当前状态。堆栈跟踪可能会在调用
Invoke
之后显示[external code],但这又怎么样呢


我是否缺少了此包装提供的一些重要功能,如果
Invoke
让异常通过unwrapped,这是不可能的?

如果有一种情况,可以在没有调用的方法抛出和异常的情况下抛出TargetInvocationException,这是有意义的。我不确定是否有这种情况

我是否错过了一些重要的功能 这个包装提供了 不可能有调用let 例外情况是否打开包装

对。一个参数是能够区分目标方法引发的异常和反射机制本身引发的异常。例如,
ArgumentException
可以从反射机制或目标方法抛出——这是两个不同的元级别


另一个参数是
invoke
方法本身的契约。在Java中,
invoke
方法只允许抛出方法签名中声明的异常。任意异常将根本不服从签名,然后需要包装。这个论点不适用于C#as,但仍然有效。
invoke
方法在文档中定义了一个契约,如果目标异常按原样抛出,则不能依赖该契约

你的第一个论点有点粗鲁。这意味着所有方法都应该包装来自对其他方法的调用的异常,以区分它们。有一些机制可以查看异常的来源:如果Invoke本身抛出异常,堆栈跟踪将指向M$代码。另外,异常的类型给出了一个提示。