Coding for KidsCoding for Kids
Kreative NivåerUtfordringerLærerveiledning
Stem på funksjoner
Avansert Pythonutviklingskurs
Kapittel
>
Nivå

Håndtering av unntak
Innpakking av et unntak

Mål

Gå til kontoret og sørg for at pengemengden er riktig balansert ved å bruke finally-kodeblokken og assert-nøkkelordet.

Dypt inne på andre etasje er et kontor dedikert til lagring av midler for fremtidige investeringer for gården. Det er på tide å sjekke at alt stemmer, og sørge for at bøkene er balansert. Når man håndterer tall, vil matematiske feil og andre problemer uunngåelig oppstå, så nok en gang er det en god idé å bruke unntakshåndtering for å fange og løse feil.

I tillegg til try / except og else kodeblokker finnes det også en finally-kodeblokk som lar deg avslutte en unntakshåndtering. I tillegg er assert-nøkkelordet en feilsøkingsfunksjon som lar deg sjekke om koden har noen feil, slik at du kan rette opp dårlig kode.

Start med å gå mot det lyse X-merket foran kontordøren og bruk funksjonen open() for å åpne døren og komme inn. Når du er inne, gå til det gylne X-merket og bruk funksjonen collect() for å hente to forskjellige konstanter med navnene: categories og savings. Konstanten categories er en liste som inneholder pengemengden for de tre kategoriene, med navnene: "exports", "imports", "stock", som må bekreftes. Konstanten savings er en variabel som inneholder pengemengden som kanskje trengs for å sikre at kassaen er riktig fylt.

Nå som alle nødvendige elementer er samlet, er det på tide å balansere pengemengden lagret i sekkene som senere vil bli samlet og distribuert av en kontorist. Gå til det mørke X-merket over det blå teppet, for X-markene over de blå, gule og røde teppene. Her vil vi bruke listen categories for å verifisere at hver sekk har alle nødvendige komponenter før den sendes ut.

Hver sekk skal inneholde komponentene som finnes i listen categories. Det finnes tre ordbokskonstanter som tilsvarer hver sekk: blue_sack, yellow_sack og red_sack. Kjør en for-løkke mens du står på X-merket over det blå teppet for å verifisere at sekken har alle nødvendige materialer, og bekreft deretter at forsyningen er registrert.

for x in range(3): player.speak("%s = %s" % (categories[x] , blue_sack[categories[x]])) player.speak("All assets accounted for")

Noen av sekkene skal ha alle nødvendige materialer, men som vanlig i disse øvelsene kan det oppstå en feil. Hvis du støter på et problem, må du bruke try / except-kodeblokker for å fange feilen, i dette tilfellet en KeyError: som oppstår hvis en ordbokstast ikke finnes. Når dette skjer, legger vi også til finally i unntaket, som avslutter unntakshåndteringen ved å legge til kode som alltid kjøres på slutten av hver feilhåndtering. I motsetning til unntak kan det bare være én finally-blokk per try. For eksempel, i tilfellet med 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")

Gjenta denne prosessen på de mørke X-markene over de gule og røde teppene, ved å bruke ordbokskonstantene yellow_sack og red_sack. Det kan hende det ikke er nødvendig i noen tilfeller, ettersom feilen bare oppstår hvis et element mangler i sekkene.

Nå som sekkene er verifisert, er det på tide å gå videre til kistene foran de grønne, lilla og oransje teppene. Her må vi sikre at pengemengden er nøyaktig 30 i hver kiste og deretter lukke dem. Det finnes tre variable konstanter som tilsvarer hver kiste, med navnene: green_chest, purple_chest og orange_chest.

Det største problemet med å verifisere kistene er at vi ikke kjenner deres nøyaktige innhold. Når du håndterer ukjente verdier, kan du bruke assert-nøkkelordet. Dette nøkkelordet lar deg verifisere om en påstand du angir er sann eller usann, noe som er veldig nyttig for å sjekke om koden din har noen feil. assert-nøkkelordet brukes i kombinasjon med: try, except, else og finally og deres ulike kombinasjoner for å reparere kode med feil. For eksempel, i tilfellet med 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 verifiserer vi om green_chest inneholder riktig mengde penger ved hjelp av assert-nøkkelordet. Hvis den ikke inneholder riktig mengde, aktiveres except-blokken, og vi beregner deretter og trekker fra den manglende forsyningen fra savings-variabelen og legger den til kisten. Hvis forsyningen er komplett, aktiveres else-blokken, og det bekreftes at alle eiendeler er registrert. Når alt er verifisert, kjøres finally-blokken, og funksjonen close() startes for å lukke kisten.

På X-markene over de grønne, lilla og oransje teppene, vend deg mot kistene og kjør verifiseringen ved å bruke: green_chest, purple_chest, orange_chest på de respektive fargede teppene. Når du er ferdig, gå til det lyse X-merket og bruk funksjonen place() for å lagre resten av savings-variabelen i kassen for å fullføre nivået.

Kodebok