Fejlett Python fejlesztési tanfolyam
Fejezet
>
Szint
Kivételkezelés
Kivétel lezárása
Cél
Menj az irodába, és győződj meg róla, hogy a pénzkészlet megfelelően kiegyensúlyozott azzal, hogy a finally kódrészletet és az assert kulcsszót használod.
A második emelet mélyén található egy iroda, amely a jövőbeli beruházásokhoz szükséges alapok tárolására szolgál. Itt itt az ideje, hogy bejelentkezz, és ellenőrizd, hogy a könyvelés egyensúlyban van-e. Mivel a számokkal dolgozva matematikai hibák és egyéb problémák előfordulása elkerülhetetlen, ezért ismételten jó ötlet a kivételkezelés alkalmazása a hibák elkapására és megoldására.
Az try / except és else kódrészleteken kívül létezik a finally kódrészlet is, amely lehetővé teszi, hogy egy kivétel kezelését lezárjuk. Ezen túlmenően az assert kulcsszó egy hibakeresési eszköz, amely segítségével ellenőrizheted, hogy egy általad megfogalmazott állítás igaz vagy hamis, így gyorsan felfedezheted a kódban rejlő hibákat.
Kezdd azzal, hogy a világos X jel felé sétálsz az iroda ajtaja előtt, és az open() függvényt használva kinyitod az ajtót a belépéshez. Miután beléptél, haladj az arany X jel felé, és használd a collect() függvényt, hogy összegyűjts két különböző állandót: categories és savings. A categories állandó egy listát tartalmaz, amely az ellenőrizendő három kategória pénzkészletét tartalmazza a következő nevekkel: "exports", "imports", "stock". A savings állandó egy olyan változót tartalmaz, amely a pénzkészletet reprezentálja, és amelyre szükség lehet a pénztárak megfelelő ellátottságának biztosításához.
Miután minden szükséges dolgot összegyűjtöttél, ideje kiegyensúlyozni a zsákokban tárolt pénzkészletet, amelyeket egy későbbi időpontban egy pultos gyűjt össze és oszt szét. Sétálj a sötét X jelhez a blue szőnyeg felett – illetve a blue, yellow és red szőnyegek X jeleihez. Itt a categories lista állandót fogjuk használni annak ellenőrzésére, hogy minden zsák tartalmazza-e az összes szükséges elemet, mielőtt szállításra kerülnének.
Azt várjuk, hogy minden zsák tartalmazza a categories listában szereplő komponenseket. Három szótár állandó tartozik az egyes zsákokhoz: blue_sack, yellow_sack és red_sack. Futtass egy for ciklust, miközben a blue szőnyeg felett lévő X jel mellett állsz, hogy ellenőrizd, a zsákban megvannak-e a szükséges anyagok, majd erősítsd meg, hogy a készlet megfelelően van számon tartva.
for x in range(3): player.speak("%s = %s" % (categories[x] , blue_sack[categories[x]])) player.speak("All assets accounted for")
Néhány zsáknak meg kell, hogy legyenek a szükséges anyagok, de mint a szokásos gyakorlatban, előfordulhat hiba. Ha problémába ütközöl, a try / except kódrészleteket kell alkalmaznod a hiba elkapásához, ebben az esetben egy KeyError: hibát, amely akkor jelentkezik, ha egy szótár kulcsa nem található. Ilyenkor a kivétel kezelését lezárva hozzáadunk egy finally blokkot, amely mindig végrehajtódik a kivételkezelés végén. A kivételekkel ellentétben egy try blokkhoz csak egy finally blokk tartozhat. Például a blue_sack esetében:
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")
Ismételd meg ezt a folyamatot a sötét X jelek esetében a yellow és red szőnyegek alatt, a yellow_sack és red_sack szótár állandók használatával. Bizonyos esetekben ez nem feltétlenül szükséges, mivel a hiba csak akkor fordul elő, ha egy zsákból hiányzik egy elem.
Miután a zsákokat ellenőriztük, ideje továbblépni a ládákhoz, amelyek a green, purple és orange szőnyegek előtt találhatók. Itt biztosítanunk kell, hogy a pénzkészlet pontosan 30 legyen minden ládában, majd azokat be is zárjuk. Három változó állandó tartozik az egyes ládákhoz, a következő neveken: green_chest, purple_chest és orange_chest.
A ládák ellenőrzésének legnagyobb problémája, hogy nem ismerjük pontos tartalmukat. Amikor ismeretlen értékekkel dolgozol, használhatod az assert kulcsszót. Ez a kulcsszó lehetővé teszi, hogy ellenőrizd, egy általad megfogalmazott állítás igaz vagy hamis, ami nagyon hasznos a kód hibáinak átvizsgálásához. Az assert kulcsszót a try, except, else és final blokkokkal, illetve ezek különböző kombinációival használjuk a hibás kód javítására. Például a green_chest esetében:
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()
A fent látható kódban az assert kulcsszó segítségével ellenőrizzük, hogy a green_chest megfelelő pénzkészletet tartalmaz-e. Ha nem, az except blokk aktiválódik, és kiszámoljuk, majd kivonjuk a hiányzó összeget a savings változóból, és hozzáadjuk a ládához. Ha a készlet teljes, az else blokk aktiválódik, megerősítve, hogy minden eszköz számon van tartva. Miután mindent ellenőriztünk, a finally blokk végrehajtódik, és meghívódik a close() függvény a láda bezárásához.
A green, purple és orange szőnyegekön található X jelekhez fordulj a ládák felé, és végezd el az ellenőrzést a megfelelő ládák esetében a green_chest, purple_chest, orange_chest állandók használatával. Miután kész vagy, sétálj a világos X jel felé, és használd a place() függvényt a savings változó maradványának tárolásához a ládában, hogy teljesítsd a szintet.