为什么将targetInvkationException引入C#?

为什么将targetInvkationException引入C#?,c#,reflection,C#,Reflection,我一直在玩弄Invoke方法,并意识到当在目标方法中抛出异常时,TargetInvokationException实际上会引发异常。我不明白为什么C#创建者使用这种方法。这对我来说毫无意义 我的意思是,为什么不抛出原始异常,而不是抛出将原始异常作为其内部异常的辅助异常呢?Invoke(或DynamicInvoke)可以在执行“real”方法之前或之后抛出自己的异常 TargetInvocationException允许确定错误的原因:委托类中的代码或方法中的代码。只是为了学究,这是一个.Net

我一直在玩弄
Invoke
方法,并意识到当在目标方法中抛出异常时,
TargetInvokationException
实际上会引发异常。我不明白为什么C#创建者使用这种方法。这对我来说毫无意义

我的意思是,为什么不抛出原始异常,而不是抛出将原始异常作为其内部异常的辅助异常呢?

Invoke
(或
DynamicInvoke
)可以在执行“real”方法之前或之后抛出自己的异常


TargetInvocationException
允许确定错误的原因:委托类中的代码或方法中的代码。

只是为了学究,这是一个.Net framework异常,而不是C#异常

使用反射意味着您可以在调用者和被调用者(发起调用的方法和被调用的最终目标方法)之间有一个非常松散的耦合。
源和目标可以位于完全不同的程序集中,这些程序集在编译时没有链接,彼此一无所知。由于这个过程的动态特性,正确的做法是采取一种方法,包装它,然后抛出新的异常。同样的方法也适用于其他地方,如TPL,在TPL中,任务中抛出的错误在被重试之前被包装在一个文件中

Invoke
还会抛出更常见的异常类型,如
invalidooperationexception
ArgumentException
——如果捕获其中一种异常,则可能会出现歧义,即它是由反射类本身引发的,还是由目标引发的,您可能会以不同的方式处理
TargetInvocationException
对于异常生成的位置是明确的。