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.