Sobes.tech
Middle+

Czy logika bloków catch do kompensacji będzie działać poprawnie przy użyciu await Task.WhenAll? Jakie wyjątki zostaną rzucone?

sobes.tech AI

Odpowiedź od AI

При использовании await Task.WhenAll(...) если один или несколько тасков завершаются с исключением, то в блоке catch будет выброшено исключение типа AggregateException. Это исключение содержит все исключения, возникшие в отдельных тасках.

Логика catch-блоков работает корректно, но важно помнить, что нужно обрабатывать именно AggregateException, чтобы получить доступ ко всем внутренним ошибкам.

Пример обработки:

try
{
    await Task.WhenAll(tasks);
}
catch (AggregateException ex)
{
    foreach (var inner in ex.InnerExceptions)
    {
        Console.WriteLine(inner.Message);
    }
}

В .NET Core и новее при использовании await AggregateException разворачивается автоматически, и можно ловить конкретные исключения напрямую, но если ловить Exception, то можно получить AggregateException.