Продвинутый курс разработки на 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 в ящике, тем самым завершая уровень.