我试图了解TPL Dataflow中的异常处理,以便能够有效地处理错误。在我的评论中,编号为1.下面,我希望能捕获一个 AggregateException
但一切都停止了,无法恢复。如果我把 throw
(2.)则 ActionBlock
继续处理,但同样的。AggregateException
处理程序不触发。
谁能帮忙解释一下,以改善我的直觉。
也欢迎任何关于这个主题的文档参考。
async Task Main()
{
var ab = new System.Threading.Tasks.Dataflow.ActionBlock<int>(async a => {
try
{
await Task.Delay(100);
if (a == 7)
{
throw new Exception("Failed");
}
else
{
Console.WriteLine(a);
}
}
catch (Exception ie)
{
Console.WriteLine(ie.Message);
throw; //2. This causes the actionblock to halt, removing allows block to continue
}
});
for (int i = 0; i < 10; i++)
{
await ab.SendAsync(i);
}
ab.Complete();
try
{
await ab.Completion;
}
catch (AggregateException ae)
{
Console.WriteLine(ae.Flatten().Message);
// 1. Expecting to catch here.
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
你看到的是 await
解开您的 Aggregate Exception。当你 await
完成任务时,异常会被解包并抛给一般的异常捕获。但如果你不解包异常,那么你会看到捕获的异常是一个集合异常,就像这样。
try
{
ab.Completion.Wait();
}
catch (AggregateException ae)
{
Console.WriteLine("Aggregate Exception");
// 1. Expecting to catch here.
}
catch (Exception e)
{
Console.WriteLine("Exception Caught");
}
显然最好是正确地 await
完成,但这个样品告诉你,确实是一个很好的例子。AggregateExcpetion
在没有拆开的时候被抓。