Sobes.tech
Middle+

Werkt de logica van catch-blokken voor compensatie correct bij het gebruik van await Task.WhenAll? Welke uitzondering wordt geworpen?

sobes.tech AI

Antwoord van 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.