2016-05-01 31 views
3

我一直在玩弄Invoke方法,實現了當異常在目標方法拋出,一個TargetInvokationException實際上提高。我不明白爲什麼C#創作者使用這種方法。這對我沒有意義。爲什麼TargetInvokationException引入C#?

我的意思是,爲什麼不拋出原來的異常,而不是拋出具有原始一個作爲其的InnerException次要的異常?

+2

'Invoke'也會引發較常見的異常類型,如'InvalidOperationException'和'ArgumentException' - 如果你抓住其中的一個,還有它是否是由反射類本身引發歧義的機會,或者通過目標,你可以處理不同的目標。 TargetInvocationException對於生成異常的位置是明確的。 –

回答

1

Invoke(或DynamicInvoke)可以拋出自己的異常,中執行一個「真實」的方法前後。

TargetInvocationException允許以確定哪些將是錯誤的原因:在委託類或方法的代碼。

3

只是迂腐,這是一個.Net框架異常 - 不是C#異常。

使用反射意味着你可以有你的主叫方和被叫方(即發起呼叫的方法,以及被稱爲終極目標的方法)之間一個非常鬆散的耦合。 源和目標可以在完全不同的程序集中,這些程序集在編譯時不鏈接,並且彼此不知道。由於這個過程的動態性質,採用event aggregation approach包裝它然後拋出新的異常是正確的。同樣的方法也被用在其他地方,比如TPL,在任務中拋出的錯誤在被重新拋出之前被包裝在System.Aggregate exception中。