2013-07-09 13 views
5

Piszę komponent, który na najwyższym poziomie wywołuje metodę poprzez odbicie. Aby uczynić mój komponent łatwiejszym w użyciu, chciałbym wychwycić wszystkie wyjątki wywoływane przez wywoływaną metodę i odwijać je.Jak poprawnie odwija ​​wyjątek TargetInvocationException?

Tak więc, mam coś takiego:

try { method.Invoke(obj, args); } 
catch (TargetInvocationException ex) { 
    throw ex.InnerException; 
} 

Jednak to zdmuchuje wewnętrzną śladu stosu wyjątku. Nie mogę tu użyć tylko throw (ponieważ ponownie wyrysowuję inny obiekt wyjątku). Co mogę zrobić w moim bloku catch, aby upewnić się, że pierwotny typ wyjątku, komunikat i śledzenie stosu są przez to przesyłane?

+0

Nie trzeba umieszczać tagów w tytule pytania. Oznaczanie poprawnie jest wystarczające. – spender

+0

Dlaczego uważasz, że łatwiej jest pomylić ślad stosu? –

Odpowiedz

13

Jak odpowiedział here, począwszy od .NET 4.5 można użyć klasy ExceptionDispatchInfo do rozwinięcia wewnętrznego wyjątku.

try 
{ 
    someMethod.Invoke(); 
} 
catch(TargetInvocationException ex) 
{ 
    ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); 
} 
+1

Należy oznaczyć jako odpowiedź. Miałem ten sam problem i doprowadzało mnie to do szału. – Zwirbelbart

Powiązane problemy