Coding for KidsCoding for Kids
Kreativa NivåerUtmaningarLärarguide
Rösta på funktioner
Avancerad Pythonutvecklingskurs
Kapitel
>
Nivå

Undantagshantering
Avsluta ett undantag

Mål

Gå till kontoret och säkerställ att penningmängden är korrekt balanserad genom att använda finally-kodblocket och assert-nyckelordet.

Djupt inne på andra våningen finns ett kontor som är dedikerat till att lagra medel för framtida investeringar på gården. Det är hög tid att stämpla in och se till att alla böcker är balanserade. När man arbetar med siffror är det oundvikligt att matematiska fel och andra problem uppstår, så som vanligt är undantagshantering en bra idé för att fånga och lösa fel.

Förutom kodblocken try / except och else finns det även ett finally-kodblock som låter dig avsluta ett undantag. Dessutom är nyckelordet assert en debug-funktion som gör det möjligt att skanna koden efter fel, vilket gör att du kan åtgärda dålig kod.

Börja med att gå till det ljusa X-märket framför kontordörren och använd funktionen open() för att öppna dörren och gå in. Väl inne, fortsätt till det gyllene X-märket och använd funktionen collect() för att hämta två olika konstanter med namnen: categories och savings. Konstanten categories är en lista som innehåller penningmängden för de tre kategorierna, namngivna: "exports", "imports", "stock", som behöver verifieras. Konstanten savings är en variabel som innehåller den penningmängd som kan behövas för att säkerställa att kistorna är ordentligt försörjda.

Nu när alla nödvändiga objekt har samlats in är det dags att balansera den penningmängd som lagras i säckarna, vilka senare kommer att samlas in och distribueras av en tjänsteman. Gå till det mörka X-märket över den blå mattan, för X-märkena över de blå, gula och röda mattorna. Här kommer vi att använda listkonstanten categories för att verifiera att varje säck innehåller alla nödvändiga komponenter innan de skickas iväg.

Varje säck ska innehålla de komponenter som anges i listan categories. Det finns tre ordbokskonstanter som motsvarar varje säck: blue_sack, yellow_sack och red_sack. Kör en for-loop medan du står på X-märket över den blå mattan för att verifiera att säcken innehåller alla nödvändiga material, och bekräfta sedan att tillgångarna är registrerade.

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

Några av säckarna borde innehålla alla nödvändiga material, men som vanligt i dessa övningar kan du stöta på ett fel. Om du stöter på ett problem måste du använda kodblocken try / except för att fånga felet, i det här fallet ett KeyError: som inträffar om en nyckel inte hittas i en ordbok. När detta händer lägger vi även till finally i undantaget, vilket avslutar hanteringen genom att köra kod som alltid exekveras i slutet av varje undantagshantering. Till skillnad från undantag kan det finnas endast ett finally-block per try. Till exempel, i fallet 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")

Upprepa denna process vid de mörka X-märkena över de gula och röda mattorna, med hjälp av ordbokskonstanterna yellow_sack och red_sack. Det kan visa sig att det inte alltid är nödvändigt, eftersom felet endast uppstår om ett objekt saknas i säckarna.

Nu när säckarna är verifierade är det dags att gå vidare till kistorna framför de: gröna, lila och orange mattorna. Här måste vi säkerställa att penningmängden är exakt 30 i varje kista och därefter stänga dem. Det finns tre variabla konstanter som motsvarar varje kista, med namnen: green_chest, purple_chest och orange_chest.

Det största problemet med att verifiera kistorna är att vi inte känner till deras exakta innehåll. När du arbetar med okända värden kan du använda nyckelordet assert. Detta nyckelord låter dig verifiera om ett påstående du gör är sant eller falskt, vilket är mycket användbart för att skanna efter fel i koden. Nyckelordet assert används i kombination med try, except, else och final samt deras olika varianter för att åtgärda fel i koden. Till exempel, i fallet 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 ovan verifierar vi om green_chest innehåller rätt mängd pengar med hjälp av nyckelordet assert. Om den inte innehåller rätt mängd, triggas except-blocket och vi beräknar den saknade mängden, drar av den från variabeln savings och lägger till den i kistan. Om tillgångarna är kompletta, triggas else-blocket och vi bekräftar att alla tillgångar är registrerade. När allt är verifierat exekveras finally-blocket och funktionen close() anropas för att stänga kistan.

På X-märkena över de gröna, lila och orange mattorna, vänd dig mot kistorna och kör verifieringen med: green_chest, purple_chest, orange_chest på respektive färgad matta. När du är klar, gå till det ljusa X-märket och använd funktionen place() för att lagra resten av variabeln savings i lådan för att slutföra nivån.

Kodbok