2010-03-03 11 views
8

Ich frage dies aus Neugier statt aufgrund eines echten Bedürfnisses zu wissen, aber ich kann keine guten Gründe für MethodInfo.Invoke, um seine Ausnahmen zu wickeln.Warum umschreibt MethodInfo.Invoke Ausnahmen in einer TargetInvocationException?

Wenn sie unwrapped übergeben werden, wäre das Debuggen solcher Ausnahmen in Visual Studio ein kleines bisschen einfacher - ich müsste VS nicht bitten, bei der ersten Chance zu stoppen, um den aktuellen Zustand an der Quelle der Ausnahme zu sehen . Der Stack-Trace würde vermutlich direkt nach dem Aufruf von Invoke [external code] anzeigen, aber was soll's.

Fehle ich einige wichtige Funktion, die diese Verpackung bietet, die nicht möglich wäre, hätte Invoke lassen Sie Ausnahmen übergeben ausgepackt?

+1

Wenn Sie eine Methode dynamisch aufrufen möchten, ohne dass Ausnahmen eingepackt sind, habe ich einen Weg gefunden, dies zu tun und darüber zu bloggen. http://timwi.blog.com/2010/03/12/dynamic-invoke/ – Timwi

Antwort

9

Fehle ich einige wichtige Funktion , dass diese Verpackung das wäre bietet nicht möglich war Invoke lassen Ausnahmen ausgepackt übergeben?

Ja. Ein Argument ist in der Lage sein, zwischen Ausnahme-throw durch die Zielmethode und Ausnahme durch den Reflexionsmechanismus selbst geworfen zu unterscheiden. Ex. Die ArgumentException kann aus dem Reflexionsmechanismus oder die Zielmethode geworfen werden - das sind zwei verschiedene Meta-Ebene.

Ein weiteres Argument ist der Vertrag der invoke Methode selbst. In Java darf die invoke-Methode nur die in der Methodensignatur deklarierte Ausnahme auslösen. Eine willkürliche Ausnahme würde der Signatur einfach nicht folgen und muss dann eingepackt werden. Dieses Argument gilt nicht für C# wie es ist, ist aber immer noch gültig. Die Methode invoke hat einen Vertrag, der in dem Dokument definiert ist, auf das Sie sich nicht verlassen konnten, wenn die Zielausnahme so geworfen wurde, wie sie ist.

+4

Ihr erstes Argument ist ein bisschen grob. Dies würde bedeuten, dass alle Methoden Ausnahmen, die von Aufrufen kommen, in andere Methoden umwandeln sollten, um zwischen ihnen zu unterscheiden. Es gibt Mechanismen, um zu sehen, woher die Ausnahme kommt: Wenn Invoke selbst löst, zeigt der Stack-Trace in M ​​$ -Code. Zusätzlich gibt der Typ der Ausnahme einen Hinweis. – mmmmmmmm

-1

Wenn es eine Situation gibt, in der die TargetInvocationException ausgelöst werden kann, ohne dass die Methode wowing und exception aufgerufen wird, ist dies sinnvoll. Ich bin mir nicht sicher, ob es einen solchen Fall gibt.

Verwandte Themen