Zachowywanie wyjątków od metod wywoływanych dynamicznie
Chcę dynamicznie wywołać aMethodInfo
obiekt i wszelkie wyjątki, które są wyrzucane z wnętrza, przechodzą na zewnątrz, tak jakby były wywoływane normalnie.
Wydaje mi się, że mam dwie opcje. Są opisane poniżej.
opcja 1 utrzymuje typ wyjątku rzucanego przezMyStaticFunction
, aleStackTrace
jest zrujnowany z powoduthrow
.
Opcja 2 utrzymujeStackTrace
wyjątku, ale typ wyjątku jest zawszeTargetInvocationException
. Mogę wyciągnąćInnerException
i jego typ, ale to znaczy, że nie mogę napisać tego na przykład:
try { DoDynamicCall(); }
catch (MySpecialException e) { /* special handling */ }
Opcja 1:
void DoDynamicCall()
{
MethodInfo method = /*referencing MyClass method void MyStaticFunction(int x)*/;
try
{
method.Invoke(null, new object[] { 5 });
}
catch (TargetInvocationException e)
{
throw e.InnerException;
}
}
Opcja 2:
void DoDynamicCall()
{
MethodInfo method = /*referencing MyClass method void MyStaticFunction(int x)*/;
method.Invoke(null, new object[] { 5 });
}
Czego naprawdę chcę jest dla dzwoniących doDoDynamicCall
otrzymywać wyjątki, jak gdyby to nazywali:
void DoDynamicCall()
{
MyClass.MyStaticFunction(5);
}
Czy istnieje sposób na czerpanie korzyści z obuopcja 1 iOpcja 2?
Edytować:Theopcja, którą chciałbym mieć (wymyślił specjalne nowe słowo kluczowe C #rethrow
na miejscu):
void DoDynamicCall()
{
MethodInfo method = /*referencing MyClass method void MyStaticFunction(int x)*/;
try
{
method.Invoke(null, new object[] { 5 });
}
catch (TargetInvocationException e)
{
//Magic "rethrow" keyword passes this exception
//onward unchanged, rather than "throw" which
//modifies the StackTrace, among other things
rethrow e.InnerException;
}
}
Pozwoliłoby to również wyeliminować tego dziwaka, ponieważ można go użyćrethrow e;
zamiast:
try { ... }
catch (Exception e)
{
if (...)
throw;
}
Ogólnie rzecz biorąc, byłby to sposób na oddzieleniethrow;
z wymogu „Muszę być bezpośrednio w bloku połowów”.