期待捕获一个聚合异常。

问题描述 投票:0回答:1

我试图了解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);
    }
}

tpl-dataflow
1个回答
0
投票

你看到的是 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 在没有拆开的时候被抓。

© www.soinside.com 2019 - 2024. All rights reserved.