Исключения в асинхронных методах обрабатываются с помощью стандартных блоков try-catch, точно как в синхронном коде. Но вот момент, когда выбрасываются исключения, отличается от обычных синхронных методов.
Исключения в асинхронных методах выбрасываются не сразу, а когда таск переходит в состояние ошибки. Исключение выбрасывается в том месте, где ты awaitишь таск, а не когда асинхронная операция запускается. Это значит, что нужно await'ить вызов метода, чтобы правильно поймать исключение.
Когда в awaited асинхронном методе происходит исключение, оно распространяется на вызывающий метод, следуя тем же правилам стека вызовов, что и в синхронном коде. Это позволяет исключениям естественным образом всплывать через слои твоего приложения.
Отдельного внимания заслуживает работа с Task.WhenAll() при одновременном выполнении нескольких тасков:
AggregateExceptionAggregateException и пройтись по отдельным исключениям через свойство InnerExceptionstry
{
await SomeAsyncMethod();
}
catch (SpecificException ex)
{
// Обработка исключения
}
Для нескольких одновременных тасков:
try
{
await Task.WhenAll(task1, task2, task3);
}
catch (AggregateException ex)
{
foreach (var innerEx in ex.InnerExceptions)
{
// Обработка каждого исключения
}
}
Исключения в асинхронных методах выбрасываются в точке, где ты await-ишь задачу, а не когда начинается асинхронная операция.
Новый — ещё не проверен сообществом
Вы