Πώς μπορούμε να πιάσουμε εξαιρέσεις στον κώδικα χρησιμοποιώντας 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.