Edistynyt Python-kehityskurssi
Luku
>
Taso
Poikkeusten käsittely
Poikkeuksen käsittelyn yhteenveto
Tavoite
Mene toimistoon ja varmista, että rahavaranto on oikein tasapainotettu käyttämällä finally-koodilohkoa ja assert-avainsanaa.
Syvällä toisessa kerroksessa on toimisto, joka on omistettu maatilan tulevia investointeja varten varattujen varojen säilytykseen. On aika tarkistaa, että kaikki kirjanpidot ovat tasapainossa. Koska numeroiden kanssa työskennellessä laskuvirheitä ja muita ongelmia voi ilmetä, poikkeusten käsittely on jälleen hyvä idea virheiden havaitsemiseksi ja korjaamiseksi.
try/except- ja else-koodilohkojen lisäksi on olemassa myös finally-koodilohko, jonka avulla voit lopettaa poikkeuksen käsittelyn. Lisäksi assert-avainsana on virheenkorjaustyökalu, jonka avulla voidaan tarkistaa, onko koodissa virheitä, jolloin huono koodi voidaan korjata.
Aloita kävelemällä toimiston oven edessä olevaan vaaleaan X-merkkiin ja käytä open()-funktiota avataksesi oven sisään pääsyä varten. Kun olet sisällä, jatka matkaa kohti kultaista X-merkkiä ja käytä collect()-funktiota kerätäksesi kaksi eri vakioita, nimeltään: categories ja savings. Vakio categories on lista, joka sisältää rahavarannot kolmelle seuraavalle kategorialle: "exports", "imports", "stock", jotka tulee tarkistaa. Vakio savings on muuttuja, joka sisältää rahavarannot, joita saatetaan tarvita sen varmistamiseksi, että arkku on asianmukaisesti täytetty.
Nyt kun kaikki tarvittavat tavarat on kerätty, on aika tasapainottaa säkeissä säilötyt rahavarannot, jotka myöhemmin noudattaa ja jakaa virkailija. Kävele tummalle X-merkille sinisen maton päällä, joka sijaitsee X-merkeissä sinisellä, keltaisella ja punaisella matolla. Tässä käytämme vakioaan categories-listaa varmistaaksemme, että kussakin säkissä on kaikki tarvittavat osat ennen niiden lähettämistä.
Jokaisen säkin on tarkoitus sisältää categories-listassa mainitut osat. On olemassa kolme sanakirjavakiota, jotka vastaavat kutakin säkkiä: blue_sack, yellow_sack ja red_sack. Suorita for-silmukka seisoessasi X-merkin päällä sinisen maton vieressä varmistaaksesi, että säkissä on kaikki vaaditut materiaalit, ja varmista sitten, että varanto on laskettu.
for x in range(3): player.speak("%s = %s" % (categories[x] , blue_sack[categories[x]])) player.speak("All assets accounted for")
Jotkut säkit saattavat sisältää kaikki vaaditut materiaalit, mutta kuten tavallisesti näissä harjoituksissa, saatat törmätä virheeseen. Jos kohtaat ongelman, sinun täytyy käyttää try/except-koodilohkoja virheen sieppaamiseen, tässä tapauksessa KeyError-virheeseen, joka tapahtuu, jos sanakirjan avainta ei löydy. Tällöin lisäämme myös finally-lohkon poikkeuksen yhteyteen, joka suorittaa aina koodin poikkeuskäsittelyn lopussa. Poikkeuksia vastaan try-lohkoa kohden voi olla vain yksi finally-lohko. Esimerkiksi blue_sack-tapauksessa:
try: for x in range(3): player.speak("%s = %s" % (categories[x] , blue_sack[categories[x]])) except: player.speak("Bag is missing %s, adding now" % (categories[x])) player.place(categories[x]) finally: player.speak("All assets accounted for")
Toista tämä prosessi tummissa X-merkeissä keltaisella ja punaisella matoilla, käyttäen yellow_sack ja red_sack -sanakirjavakioita. Joissakin tapauksissa tätä ei välttämättä tarvita, sillä virhe esiintyy vain, jos säkeistä puuttuu jokin kohde.
Nyt kun säkit on tarkistettu, on aika siirtyä arkkujen pariin, jotka sijaitsevat vihreän, purppuran ja oranssin mattojen edessä. Tässä meidän on varmistettava, että kussakin arkkussa rahavaranto on tarkalleen 30, ja sen jälkeen arkkua suljetaan. On olemassa kolme muuttujaa, jotka vastaavat kutakin arkkua, nimittäin: green_chest, purple_chest ja orange_chest.
Suurin haaste arkkujen tarkistamisessa on se, ettemme tiedä niiden tarkkaa sisältöä. Kun työskentelet tuntemattomien arvojen kanssa, voit käyttää assert-avainsanaa. Tämä avainsana sallii sinun tarkistaa, onko antamasi väite totta vai epätotta, mikä on erittäin hyödyllistä virheiden havaitsemiseksi koodissasi. assert-avainsanaa käytetään yhdessä try, except, else ja final-lohkojen sekä niiden eri yhdistelmien kanssa virheellisen koodin korjaamiseksi. Esimerkiksi green_chest-tapauksessa:
try: assert(green_chest = 30) except AssertionError: player.speak("Chest is not full %s/30" % green_chest) drop = 30-green_chest savings -= drop player.place(drop) else: player.speak("All assets accounted for") finally: player.close()
Yllä olevassa koodissa varmistamme, että green_chest sisältää oikean määrän rahavarantoa assert-avainsanan avulla. Jos arkkua ei täytetä oikealla määrällä, except-lohko aktivoituu, jolloin lasketaan puuttuva summa, vähennetään se savings-muuttujasta ja lisätään arkkuun. Jos varanto on täydellinen, else-lohko aktivoituu ja vahvistetaan, että kaikki omaisuuserät on laskettu. Kun kaikki on tarkistettu, finally-lohko suoritetaan ja käynnistetään close()-funktio arkun sulkemiseksi.
Vihreän, purppuran ja oranssin mattojen X-merkeissä, kohtaa arkut ja suorita tarkistus käyttäen green_chest, purple_chest ja orange_chest -muuttujia kyseisillä värimatoilla. Kun olet valmis, kävele vaaleaan X-merkkiin ja käytä place()-funktiota tallentaaksesi jäljelle jääneen savings-muuttujan arkin sisään tason loppuunsaattamiseksi.