Sobes.tech
Middle

Kaip su await sugauti išimtis kode?

sobes.tech AI

Atsakymas iš AI

Klaidų, naudojant await kodą, gaudymas vyksta per standartinius try...catch blokus.

Pavyzdys:

public async Task GetDataAsync()
{
    try
    {
        // Asinchroninės operacijos iškvietimas, kuri gali sukelti išimtį
        var result = await SomeService.FetchDataFromApiAsync();
        // Sėkmingo rezultato apdorojimas
    }
    catch (UnauthorizedAccessException ex)
    {
        // Konkretus išimties apdorojimas (pvz., trūksta teisių)
        Console.WriteLine($"Autorizacijos klaida: {ex.Message}");
    }
    catch (HttpRequestException ex)
    {
        // HTTP užklausos išimties apdorojimas (pvz., tinklo problemos)
        Console.WriteLine($"HTTP užklausos klaida: {ex.Message}");
    }
    catch (Exception ex)
    {
        // Visų kitų neapdorotų išimčių apdorojimas
        Console.WriteLine($"Nenumatyta klaida: {ex.Message}");
    }
}

Jei asinchroninė operacija, nurodyta await, išmeta išimtį, tiesioginis kodo vykdymas yra nutraukiamas, ir valdymas perduodamas atitinkamam catch blokui toje pačioje asinchroninėje funkcijoje (arba ją kviečiančioje). Be await, išimtis iš asinchroninės operacijos nebus sugauta kviečiančioje funkcijoje iki tol, kol užduotis/operacija nebus baigta ir jos rezultatas/išimtis nebus prašoma (pvz., per .Result ar .Wait(), kas nerekomenduojama). await iš esmės "išskleidžia" išimtį iš užduoties ir ją pakartotinai meta, leidžiant ją įprastai sugauti naudojant try...catch.