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.