小编典典

如何在不丢失C#中的堆栈跟踪的情况下抛出InnerException?

c#

我正在通过反射调用可能导致异常的方法。在没有包装反射的情况下,如何将异常传递给调用者?
我抛出了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;
    }
}

阅读 325

收藏
2020-05-19

共1个答案

小编典典

.NET 4.5中 ,现在有了ExceptionDispatchInfo类。

这使您可以捕获异常并重新引发它,而无需更改堆栈跟踪:

try
{
    task.Wait();
}
catch(AggregateException ex)
{
    ExceptionDispatchInfo.Capture(ex.InnerException).Throw();
}

这适用于任何异常,而不仅仅是AggregateException

它是由于awaitC#语言功能而引入的,该功能从AggregateException实例解开了内部异常,以使异步语言功能更像同步语言功能。

2020-05-19