Curs Avansat de Dezvoltare Python
Capitolul
>
Nivel
Gestionarea excepțiilor
Încheierea unei excepții
Obiectiv
Mergi la birou și asigură-te că aprovizionarea cu bani este corect echilibrată folosind blocul de cod finally și cuvântul cheie assert.
Adânc, la etajul doi, un birou este dedicat stocării fondurilor pentru investiții viitoare ale fermei. Este momentul să verifici și să te asiguri că toate cărțile contabile sunt echilibrate. Când lucrezi cu numere, erorile matematice și alte probleme sunt inevitabile, așa că, din nou, gestionarea excepțiilor este o idee bună pentru a prinde și remedia erorile.
Pe lângă blocurile de cod try / except și else, există și blocul de cod finally care îți permite să finalizezi o excepție. În plus, cuvântul cheie assert este o funcționalitate de depanare care îți permite să verifici dacă un cod are erori, permițându-ți să corectezi codul defect.
Începe mergând către marca X luminoasă din fața ușii biroului și folosind funcția open() pentru a deschide ușa și a intra. Odată ajuns înăuntru, îndreaptă-te către marca X de culoare aurie și folosește funcția collect() pentru a prelua două constante diferite numite: categories și savings. Constanta categories este o listă care conține aprovizionarea cu bani pentru cele trei categorii, numite: "exports", "imports", "stock", care trebuie verificate. Constanta savings este o variabilă care reține aprovizionarea cu bani ce ar putea fi necesară pentru a asigura o alimentare corespunzătoare a cufertelor.
Acum că toate obiectele necesare au fost colectate, este timpul să echilibrezi aprovizionarea cu bani stocată în saci care vor fi colectați și distribuiți de un funcționar după ce termini. Mergi către marca X întunecată de pe covorul blue, pentru mărcile X de pe covoarele blue, yellow și red. Aici vom folosi constanta listă categories pentru a verifica dacă fiecare sac are toate componentele necesare înainte de a fi expediat.
Fiecare sac ar trebui să conțină componentele găsite în lista categories. Există trei constante de tip dicționar care corespund fiecărui sac: blue_sack, yellow_sack și red_sack. Rulează un ciclu for în timp ce stai pe marca X de pe covorul blue pentru a verifica dacă sacul are toate materialele necesare, apoi confirmă că aprovizionarea este contabilizată.
for x in range(3): player.speak("%s = %s" % (categories[x] , blue_sack[categories[x]])) player.speak("All assets accounted for")
Unele din saci ar trebui să aibă toate materialele necesare, dar, ca de obicei în aceste exerciții, este posibil să întâmpini o eroare. Dacă întâlnești o problemă, trebuie să folosești blocurile de cod try / except pentru a prinde eroarea, în acest caz fiind un KeyError:, care apare dacă o cheie din dicționar nu este găsită. Când se întâmplă acest lucru, adăugăm de asemenea finally la excepție, care finalizează tratarea excepției adăugând un cod ce se execută întotdeauna la sfârșitul fiecărui bloc de tratare a excepției. Spre deosebire de excepții, poate exista doar un bloc finally per try. De exemplu, în cazul 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")
Repetă acest proces pe mărcile X întunecate de pe covoarele yellow și red, folosind constantele de dicționar yellow_sack și red_sack. S-ar putea să nu fie necesar în unele cazuri, deoarece eroarea apare doar dacă lipsește un obiect din saci.
Acum că sacii au fost verificați, este timpul să treci la cuferele din fața covoarelor: green, purple și orange. Aici trebuie să ne asigurăm că aprovizionarea cu bani este exact 30 în fiecare cufăr și apoi sunt închise ulterior. Există trei constante variabile care corespund fiecărui cufăr, numite: green_chest, purple_chest și orange_chest.
Cea mai mare problemă la verificarea cufertelor este că nu știm conținutul lor exact; când te confrunți cu valori necunoscute, poți folosi cuvântul cheie assert. Acest cuvânt cheie îți permite să verifici dacă o afirmație pe care o declari este adevărată sau falsă, ceea ce este foarte util pentru a identifica dacă codul tău are erori. Cuvântul cheie assert este folosit împreună cu: try, except, else și final și diversele lor combinații pentru a repara codul cu erori. De exemplu, în cazul 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()
În codul de mai sus, verificăm dacă green_chest conține cantitatea corectă de aprovizionare cu bani folosind cuvântul cheie assert. Dacă nu conține cantitatea corectă, se declanșează blocul except și calculăm apoi scădem aprovizionarea lipsă din variabila savings și o adăugăm în cufăr. Dacă aprovizionarea este completă, se declanșează blocul else și se confirmă că toate activele sunt contabilizate. Odată ce totul este verificat, se execută blocul finally și se inițiază funcția close() pentru a închide cufărul.
Pe mărcile X de pe covoarele green, purple și orange, orientează-te spre cufere și rulează verificarea folosind: green_chest, purple_chest, orange_chest pe covoarele de culori respective. Odată ce ai terminat, mergi la marca X luminoasă și folosește funcția place() pentru a depozita restul variabilei savings în ladă pentru a completa nivelul.