Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Virheenkäsittely Asynkronisessa Koodissa | Asynchronous Programming
Pythonin Rakenteellinen Ohjelmointi

Virheenkäsittely Asynkronisessa Koodissa

Pyyhkäise näyttääksesi valikon

Kun työskentelet asynkronisen koodin kanssa Pythonissa käyttäen asyncio-kirjastoa, virheiden käsittely vaatii erityistä huomiota, koska poikkeukset voivat levitä eri tavalla kuin synkronisessa koodissa. Synkronisessa kontekstissa käytetään usein try-except-lohkoa poikkeusten sieppaamiseen koodin ympärillä, joka saattaa epäonnistua. Sama rakenne toimii myös koroutineissa, mutta asyncio-tehtävien kanssa on lisähuomioita.

Jos poikkeus nostetaan async def -koroutinissa eikä sitä käsitellä, se etenee siihen pisteeseen asti, jossa koroutiinia odotetaan (await). Jos käytät await-komentoa koroutiinille, joka nostaa poikkeuksen, poikkeus nostetaan odotuskohdassa, jolloin sen voi siepata try-except-lohkolla. Jos kuitenkin ajoitat koroutiinia tehtäväksi käyttäen asyncio.create_task() tai asyncio.ensure_future(), poikkeus ei leviä välittömästi. Sen sijaan se tallennetaan tehtäväobjektiin ja nostetaan vasta, kun odotat tehtävää eksplisiittisesti tai tarkistat sen tuloksen.

Tämä tarkoittaa, että jos et käsittele poikkeuksia koroutinissa tai odottaessasi tehtävää, saatat ohittaa kriittisiä virheitä tai poikkeukset voivat kirjautua tapahtumasilmukkaan "käsittelemättöminä poikkeuksina". Tämän välttämiseksi poikkeukset kannattaa käsitellä joko koroutinissa try-except-rakenteella tai varmistaa, että kaikki tehtävät odotetaan ja niiden tulokset käsitellään asianmukaisesti. Tämä lähestymistapa auttaa pitämään asynkroniset ohjelmat vakaana ja helpottaa virheenkorjausta.

Tässä on Python-koodiesimerkki, joka havainnollistaa poikkeusten käsittelyä asynkronisessa koroutinissa try-except-lohkolla:

import asyncio

async def may_fail(n):
    try:
        if n % 2 == 0:
            raise ValueError(f"Even number error: {n}")
        print(f"Processed: {n}")
    except ValueError as e:
        print(f"Caught exception in coroutine: {e}")

async def main():
    tasks = [asyncio.create_task(may_fail(i)) for i in range(3)]
    await asyncio.gather(*tasks)

asyncio.run(main())

Odotettu tuloste:

Caught exception in coroutine: Even number error: 0
Processed: 1
Caught exception in coroutine: Even number error: 2

Tässä koodiesimerkissä määritellään asynkroninen koroutiini may_fail, joka käyttää try-except-lohkoa ValueError-poikkeusten sieppaamiseen, kun parillista lukua käsitellään. Jos n on parillinen, nostetaan ValueError, joka siepataan koroutinissa ja tulostetaan viesti. main-koroutiini ajoittaa kolme tehtävää käyttäen asyncio.create_task() ja kerää ne asyncio.gather()-kutsulla, varmistaen että kaikki tehtävät odotetaan. Tämä järjestely varmistaa, että koroutineissa nostetut poikkeukset käsitellään hallitusti eikä tapahtumasilmukkaan jää käsittelemättömiä poikkeuksia.

question mark

Miten poikkeukset voidaan käsitellä oikein asynkronisissa korutiineissa käsittelemättömien virheiden välttämiseksi?

Valitse kaikki oikeat vastaukset

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 4. Luku 5

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Osio 4. Luku 5
some-alt