如何正确地重新抛出已经处于故障状态的任务的exception?
我有一个同步方法,除其他外,它检查待处理任务的状态并重新抛出其exception,如果有的话:
void Test(Task task) { // ... if (task.IsFaulted) throw task.Exception; // ... }
这不会传播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)(); // ... }
要正确地重新抛出exception,您应该使用ExceptionDispatchInfo
:
ExceptionDispatchInfo.Capture(task.Exception.InnerException).Throw();
你也可以这样做:
task.GetAwaiter().GetResult();
PS您的Action
方法无法正常工作,因为您正在创建async void
方法,并且无法捕获从该方法传播的exception。