我有一个同步方法,除其他外,它检查待处理任务的状态并重新抛出其异常,如果有的话:
void Test(Task task)
{
// ...
if (task.IsFaulted)
throw task.Exception;
// ...
}
这不会传播异常堆栈跟踪信息,并且对调试器不友好。
现在,如果Test
是async
,那就不会像这样简单自然了:
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)();
// ...
}
答案 0 :(得分:16)
要正确地重新抛出异常,您应该使用ExceptionDispatchInfo
:
ExceptionDispatchInfo.Capture(task.Exception.InnerException).Throw();
您 也可以:
task.GetAwaiter().GetResult();
P.S。您的Action
方法无法正常运行,因为您正在创建async void
方法,并且无法捕获从该方法传播的异常。