Курс по усъвършенствано разработване с Python
Глава
>
Ниво
Обработка на изключения
Обобщаване на изключение
Цел
Отиди до офиса и се увери, че паричните средства са правилно балансирани чрез използването на finally кода и ключовата дума assert.
Дълбоко на втория етаж има офис, посветен на съхранението на средства за бъдещи инвестиции във фермата. Време е да се провери и да се увериш, че всички книги са балансирани. Когато работиш с числа, неизбежно ще се появят математически грешки и други проблеми, така че отново обработката на изключения е добра идея за отлавяне и коригиране на грешките.
Освен try / except и else кодовите блокове, има и кодов блок finally, който ти позволява да завършиш обработката на изключения. Освен това, ключовата дума assert е функция за отстраняване на грешки, която ти позволява да провериш дали кодът съдържа грешки, за да можеш да поправиш лошия код.
Започни, като отидеш към светлия X знак пред вратата на офиса и използваш функцията open() за да отвориш вратата и да влезеш. Веднъж влязъл, насочи се към златния X знак и използвай функцията collect(), за да вземеш две различни константи с имена: categories и savings. Константата categories е списък, който съдържа паричната наличност на трите категории, наречени: "exports", "imports", "stock", които трябва да бъдат проверени. Константата savings е променлива, която съдържа парична наличност, която може да е необходима, за да се осигури, че касите са правилно запасени.
Сега, когато всички необходими елементи са събрани, е време да балансираш паричната наличност, съхранявана в чувалите, които ще бъдат събрани и разпределени от служител след това. Отиди до тъмния X знак върху синия килим, за X знаците върху синия, жълтия и червения килим. Тук ще използваме списъчната константа categories, за да проверим дали всеки чувал съдържа всички необходими компоненти преди да бъде изпратен.
Всеки чувал трябва да съдържа компонентите, изброени в списъка categories. Има три речникови константи, които съответстват на всеки чувал: blue_sack, yellow_sack и red_sack. Изпълни цикъл for, като стоиш на X знака върху синия килим, за да провериш дали чувалът съдържа всички нужни материали, след което потвърди, че наличността е отчетена.
for x in range(3): player.speak("%s = %s" % (categories[x] , blue_sack[categories[x]])) player.speak("All assets accounted for")
Някои от чувалите трябва да съдържат всички необходими материали, но както обикновено при тези упражнения, може да срещнеш грешка. Ако се появи проблем, трябва да използваш кодовите блокове try / except, за да уловиш грешката, в този случай KeyError:, която се появява, ако даден ключ в речника не бъде намерен. Когато това се случи, добавяме и finally към обработката на изключението, който завършва обработката, като изпълнява код, който винаги се изпълнява в края на всяка обработка на изключение. За разлика от изключенията, може да има само един блок finally на всеки try. Например, в случая с 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")
Повтори този процес върху тъмните X знаци върху жълтия и червения килим, като използваш речниковите константи yellow_sack и red_sack. Това може да не е необходимо в някои случаи, тъй като грешката се появява само ако в чувалите липсва елемент.
Сега, след като чувалите са проверени, е време да преминем към сандъците пред: зеления, лилавия и оранжевия килим. Тук трябва да се уверим, че паричната наличност във всеки сандък е точно 30, след което сандъкът да бъде затворен. Има три променливи константи, съответстващи на всеки сандък, с имена: green_chest, purple_chest и orange_chest.
Най-големият проблем при проверката на сандъците е, че не знаем точното им съдържание. Когато работиш с неизвестни стойности, можеш да използваш ключовата дума assert. Тази ключова дума ти позволява да провериш дали дадено твърдение, което декларираш, е вярно или невярно, което е много полезно за откриване на грешки в кода. Ключовата дума assert се използва в комбинация с: try, except, else и finally и техните различни комбинации за поправка на кода с грешки. Например, в случая с 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()
В горния код се проверява дали green_chest съдържа правилното количество парична наличност чрез ключовата дума assert. Ако не съдържа необходимото количество, се активира блокът except, в който изчисляваме липсващата наличност, изваждаме тази стойност от променливата savings и я добавяме в сандъка. Ако наличността е пълна, се активира блокът else и се потвърждава, че всички активи са отчетени. След като всичко бъде проверено, се изпълнява блокът finally и се извиква функцията close() за затваряне на сандъка.
При X знаците върху зеления, лилавия и оранжевия килим, обърни се към сандъците и извърши проверката, използвайки: green_chest, purple_chest, orange_chest върху съответните килими с цвят. След като приключиш, отиди до светлия X знак и използвай функцията place(), за да съхраниш останалата част от променливата savings в кутията, с която да завършиш нивото.