Ожидая поймать Совокупное исключение - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь понять обработку исключений в потоке данных TPL, чтобы эффективно обрабатывать ошибки. В моем комментарии под номером 1. ниже я ожидаю поймать AggregateException, но все просто останавливается и не восстанавливается. Если я удаляю throw (2.), то ActionBlock продолжает обрабатываться, но снова обработчик AggregateException не запускается.

Кто-нибудь сможет помочь с объяснением, как улучшить мой Интуиция.

Также приветствуются любые ссылки на документацию по topi c.

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);
    }
}

1 Ответ

0 голосов
/ 27 апреля 2020

То, что вы видите, - это await развертывание вашего Совокупного исключения. Когда вы 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 ловится, когда он не развернут.

...