Avanceret Python Udviklingskursus
Kapitel
>
Niveau
Undtagelseshåndtering
Afslutning af en undtagelse
Mål
Gå til kontoret og sørg for, at pengemængden er korrekt afbalanceret ved at bruge finally kodeblokken og assert nøgleordet.
Dybt inde på anden sal er et kontor dedikeret til at opbevare midler til fremtidige investeringer for gården. Det er på tide at tjekke ind og sikre, at alle regnskaber er afbalancerede. Når man arbejder med tal, vil matematikfejl og andre problemer uundgåeligt opstå, så det er igen en god idé at benytte undtagelseshåndtering for at fange og løse fejl.
Ud over try / except og else kodeblokke findes der også en finally kodeblok, der giver dig mulighed for at afslutte en undtagelse. Derudover er assert nøgleordet en debug-funktion, der giver dig mulighed for at kontrollere, om koden har fejl, så du kan rette dårlig kode.
Start med at gå mod det lyse X-mærke foran kontordøren og brug open() funktionen til at åbne døren for at komme ind. Når du er indenfor, skal du bevæge dig mod det gyldne X-mærke og bruge collect() funktionen til at hente to forskellige konstanter: categories og savings.
Konstanten categories er en liste, der indeholder pengemængden for de tre kategorier, navngivet: "exports", "imports", "stock", som skal verificeres. Konstanten savings er en variabel, der indeholder pengemængden, som kan være nødvendig for at sikre, at kasserne er forsynet korrekt.
Nu hvor alle nødvendige genstande er indsamlet, er det tid til at afbalancere den pengebeholdning, der er opbevaret i sække, som senere vil blive indsamlet og distribueret af en kasserer, når du er færdig. Gå til det mørke X-mærke over det blå tæppe, for X-mærkerne over de blå, gule og røde tæpper. Her vil vi bruge konstanten categories til at verificere, at hver sæk har alle de nødvendige komponenter, inden de sendes af sted.
Hver sæk skal indeholde de komponenter, der findes i categories-listen. Der findes tre ordbogs-konstanter, der svarer til hver sæk: blue_sack, yellow_sack og red_sack. Kør en for-løkke, mens du står på X-mærket over det blå tæppe, for at verificere, at sækken har alle de nødvendige materialer, og derefter bekræfte, at beholdningen er registreret.
for x in range(3): player.speak("%s = %s" % (categories[x] , blue_sack[categories[x]])) player.speak("All assets accounted for")
Nogle af sækkene burde have alle de nødvendige materialer, men som sædvanligt i disse øvelser kan du støde på en fejl. Hvis du støder på et problem, skal du bruge try / except kodeblokke for at fange fejlen, i dette tilfælde en KeyError:, som opstår, hvis en ordbogs-nøgle ikke findes. Når dette sker, tilføjer vi også finally til undtagelsen, som afslutter undtagelsen ved at udføre kode, der altid kører i slutningen af hver undtagelseshåndtering. I modsætning til undtagelser kan der kun være én finally blok per try. For eksempel, i tilfælde af blue_sack:
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")
Gentag denne proces på de mørke X-mærker over de gule og røde tæpper, ved at bruge ordbogs-konstanterne yellow_sack og red_sack. Det kan i nogle tilfælde være unødvendigt, da fejlen kun opstår, hvis der mangler en genstand i sækkene.
Nu hvor sækkene er kontrolleret, er det tid til at gå videre til kisterne foran de: grønne, lilla og orange tæpper. Her skal vi sikre, at pengebeholdningen er præcis 30 i hver kiste, hvorefter de lukkes. Der findes tre variabelkonstanter svarende til hver kiste, navngivet: green_chest, purple_chest og orange_chest.
Det største problem med at verificere kisterne er, at vi ikke kender deres præcise indhold; når du arbejder med ukendte værdier, kan du bruge nøgleordet assert. Dette nøgleord giver dig mulighed for at verificere, om en erklæring, du laver, er sand eller falsk; det er meget nyttigt til at tjekke din kode for fejl. Nøgleordet assert bruges sammen med: try, except, else og final og deres forskellige kombinationer for at rette kode med fejl. For eksempel, i tilfælde af green_chest:
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()
I koden ovenfor verificerer vi, om green_chest indeholder den korrekte pengebeholdning ved hjælp af assert-nøgleordet. Hvis den ikke indeholder den korrekte mængde, aktiveres except-blokken, og vi beregner derefter og trækker den manglende beholdning fra savings-variablen og tilføjer den til kisten. Hvis beholdningen er komplet, aktiveres else-blokken, og det bekræftes, at alle aktiver er registreret. Når alt er blevet verificeret, udføres finally-blokken, og close()-funktionen initieres for at lukke kisten.
På X-mærkerne over de grønne, lilla og orange tæpper, vend dig mod kisterne, og kør verifikationen ved at bruge: green_chest, purple_chest, orange_chest på de respektive farvede tæpper. Når du er færdig, gå til det lyse X-mærke og brug place()-funktionen for at opbevare resten af savings-variablen i kassen for at fuldføre niveauet.