如何正确地重新抛出已经处于故障状态的任务的异常?

时间:2013-11-24 02:52:18

标签: c# .net task-parallel-library async-await

我有一个同步方法,除其他外,它检查待处理任务的状态并重新抛出其异常,如果有的话:

void Test(Task task)
{
    // ...
    if (task.IsFaulted)
        throw task.Exception;
    // ...
}

这不会传播异常堆栈跟踪信息,并且对调试器不友好。

现在,如果Testasync,那就不会像这样简单自然了:

async Task Test(Task task)
{
    // ...
    if (task.IsFaulted)
        await task; // rethrow immediately and correctly
    // ...
}

问题:如何正确使用同步方法?我已经想出了这个但我不喜欢它:

void Test(Task task)
{
    // ...
    if (task.IsFaulted)
        new Action(async () => await task)();
    // ...
}

1 个答案:

答案 0 :(得分:16)

要正确地重新抛出异常,您应该使用ExceptionDispatchInfo

ExceptionDispatchInfo.Capture(task.Exception.InnerException).Throw();

也可以:

task.GetAwaiter().GetResult();

P.S。您的Action方法无法正常运行,因为您正在创建async void方法,并且无法捕获从该方法传播的异常。