Sobes.tech
Middle

Как да уловим изключения в кода с помощта на await?

sobes.tech AI

Отговор от AI

Изключенията в кода, който използва await, се улавят чрез стандартните блокове try...catch.

Пример:

public async Task GetDataAsync()
{
    try
    {
        // Вика на асинхронна операция, която може да генерира изключение
        var result = await SomeService.FetchDataFromApiAsync();
        // Обработка на успешния резултат
    }
    catch (UnauthorizedAccessException ex)
    {
        // Обработка на специфично изключение (например, липса на права)
        Console.WriteLine($"Грешка при авторизация: {ex.Message}");
    }
    catch (HttpRequestException ex)
    {
        // Обработка на изключение при HTTP заявка (например, проблеми с мрежата)
        Console.WriteLine($"Грешка при HTTP заявка: {ex.Message}");
    }
    catch (Exception ex)
    {
        // Обработка на всички други непотушени изключения
        Console.WriteLine($"Настъпи неочаквана грешка: {ex.Message}");
    }
}

Ако асинхронната операция, към която сочи await, хвърли изключение, изпълнението на директния поток от код се прекъсва и управлението се прехвърля към съответния блок catch в същата асинхронна функция (или в тази, която я извиква). Без await изключението от асинхронната операция няма да бъде уловено от извикващата функция, докато задачата/операцията не бъде завършена и нейният резултат/изключение не бъде поискано (например чрез .Result или .Wait(), което не се препоръчва). await всъщност "разгъва" изключението от задачата и го пренасочва, правейки възможно неговото уловене по обичайния начин с try...catch.