我正在通过反射调用可能导致异常的方法。在没有包装反射的情况下,如何将异常传递给调用者? 我抛出了InnerException,但是这破坏了堆栈跟踪。 示例代码:
public void test1() { // Throw an exception for testing purposes throw new ArgumentException("test1"); } void test2() { try { MethodInfo mi = typeof(Program).GetMethod("test1"); mi.Invoke(this, null); } catch (TargetInvocationException tiex) { // Throw the new exception throw tiex.InnerException; } }
在 .NET 4.5中 ,现在有了ExceptionDispatchInfo类。
ExceptionDispatchInfo
这使您可以捕获异常并重新引发它,而无需更改堆栈跟踪:
try { task.Wait(); } catch(AggregateException ex) { ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); }
这适用于任何异常,而不仅仅是AggregateException。
AggregateException
它是由于awaitC#语言功能而引入的,该功能从AggregateException实例解开了内部异常,以使异步语言功能更像同步语言功能。
await