2010-03-03 14 views
8

Lo sto chiedendo per curiosità piuttosto che per un reale bisogno di sapere, ma non riesco a pensare a nessuna buona ragione per il MethodInfo.Invoke di includere le sue eccezioni.Perché MethodInfo.Invoke racchiude le eccezioni in TargetInvocationException?

Se si desidera che passino da scartare, il debug di tali eccezioni in Visual Studio sarebbe un po 'più semplice - Non avrei bisogno di chiedere a VS di fermarsi alle eccezioni di prima volta per vedere lo stato corrente all'origine dell'eccezione . La traccia di stack mostrerebbe presumibilmente [codice esterno] subito dopo la chiamata a Invoke, ma allora cosa.

Mi mancano alcune funzioni importanti che questo involucro fornisce che non sarebbe possibile avere Invoke lasciare passare le eccezioni scartate?

+1

Se si desidera richiamare un metodo in modo dinamico senza che le eccezioni siano state completate, ho trovato un modo per farlo e bloggato su di esso. http://timwi.blog.com/2010/03/12/dynamic-invoke/ – Timwi

risposta

9

Mi sto perdendo alcune importanti funzioni che questo involucro prevede che sarebbe non fosse possibile si era lasciato Invoke eccezioni passano scartare?

Sì. Un argomento è quello di essere in grado di distinguere tra il lancio dell'eccezione dal metodo di destinazione e l'eccezione generata dal meccanismo di riflessione stesso. Ex. il ArgumentException può essere lanciato dal meccanismo di riflessione o il metodo di destinazione: si tratta di due diversi livelli di meta.

Un altro argomento è il contratto del metodo invoke. In Java, il metodo invoke è autorizzato a generare solo l'eccezione dichiarata nella firma del metodo. Un'eccezione arbitraria semplicemente non obbedire alla firma e deve quindi essere avvolta. Questo argomento non vale per C# così com'è, ma è ancora valido. Il metodo invoke ha un contratto definito nel documento su cui non si può fare affidamento, se l'eccezione di destinazione è stata generata così com'è.

+4

Il tuo primo argomento è un po 'grezzo. Ciò significherebbe che tutti i metodi dovrebbero racchiudere eccezioni provenienti da chiamate ad altri metodi per distinguerle. Esistono meccanismi per vedere da dove proviene l'eccezione: se Invoke stesso lancia, la traccia dello stack punta al codice M $. Inoltre il tipo di eccezione dà un suggerimento. – mmmmmmmm

-1

Se esiste una situazione in cui è possibile lanciare TargetInvocationException senza il lancio e l'eccezione del metodo richiamato, ha senso. Non sono sicuro se c'è un caso del genere.

Problemi correlati