Sobes.tech
Middle

Jak złapać wyjątki w kodzie za pomocą await?

sobes.tech AI

Odpowiedź od AI

Wyjątki w kodzie korzystającym z await są przechwytywane przez standardowe bloki try...catch.

Przykład:

public async Task GetDataAsync()
{
    try
    {
        // Wywołanie operacji asynchronicznej, która może wygenerować wyjątek
        var result = await SomeService.FetchDataFromApiAsync();
        // Obsługa pomyślnego wyniku
    }
    catch (UnauthorizedAccessException ex)
    {
        // Obsługa specyficznego wyjątku (np. brak uprawnień)
        Console.WriteLine($"Błąd autoryzacji: {ex.Message}");
    }
    catch (HttpRequestException ex)
    {
        // Obsługa wyjątku żądania HTTP (np. problemy z siecią)
        Console.WriteLine($"Błąd żądania HTTP: {ex.Message}");
    }
    catch (Exception ex)
    {
        // Obsługa innych nieobsłużonych wyjątków
        Console.WriteLine($"Wystąpił nieoczekiwany błąd: {ex.Message}");
    }
}

Jeśli operacja asynchroniczna wskazana przez await wyrzuci wyjątek, wykonanie bezpośredniego przepływu kodu zostanie przerwane, a kontrola przejdzie do odpowiedniego bloku catch w tej samej funkcji asynchronicznej (lub wywołującej ją). Bez await wyjątek z operacji asynchronicznej nie zostanie przechwycony przez funkcję wywołującą do czasu, aż zadanie/operacja nie zostanie zakończona i jej wynik/wyjątek nie zostanie pobrany (np. przez .Result lub .Wait(), co nie jest zalecane). await w rzeczywistości "rozpakowuje" wyjątek z zadania i go ponownie rzuca, umożliwiając standardowe przechwytywanie za pomocą try...catch.