Продвинутый курс разработки на Python
Глава
>
Уровень
Обработка исключений
Несколько исключений
Цель
Соберите и правильно разместите некоторые медицинские материалы в ящиках, используя несколько обработчиков исключений.
Складские помещения на крыше необходимо пополнить, некоторые материалы были использованы, но так и не были заменены. В одном из складов найден меморандум с заказом на дополнительные материалы, так что было бы неплохо заняться этим. Однако существует множество различных материалов, которые нужно собрать и разместить в ящиках.
Из-за того, что для заполнения ящиков требуются данные различных типов и разное количество материалов, могут возникнуть различные ошибки. Мы можем использовать конструкцию try / except для отлавливания возможных ошибок и исправления некоторых проблем, но что делать, если в одной операции возможно возникновение нескольких ошибок? Для решения этой проблемы можно указать, какие именно исключения необходимо отлавливать, и использовать несколько блоков исключений.
Для начала пройдите к золотому знаку X и повернитесь к двери, используйте функцию open(), чтобы войти в складское помещение. Оказавшись внутри, пройдите к темному знаку X и поверните направо, чтобы использовать функцию read() и проверить, какие материалы и в каком количестве заказаны в меморандуме на столе. В меморандуме указана информация о константах списков, включающая материалы и их заказы. После этого пройдите к светлому знаку X внутри склада, поверните к ящику и с помощью функции collect() возьмите константу списка материалов pads, как показано: player.collect(pads) .
Внутри склада имеются запасы "peroxide" и "isopropyl". Пройдите и соберите их все, затем выйдите на улицу и направляйтесь к темному знаку X на пурпурном ковре. На пурпурном ковре, лицом к ящику, используйте функцию collect(), чтобы взять "water bottle", затем перейдите к темному знаку X на желтом ковре и используйте функцию collect(), чтобы взять "glass bottle".
Теперь, когда предметы собраны, пора выполнить заказ и разместить все материалы в ящиках склада справа. Для этого мы сначала поместим в список с именем supplies следующие элементы: "water bottle", "peroxide" и "isopropyl". На темных знаках X на красном, зеленом и синем коврах мы будем использовать ящики для хранения медицинских материалов. Для этого мы создадим три списка: blue_crate = [], green_crate = [] и red_crate = [].
Перед тем, как разместить все элементы, необходимо заполнить все списки материалами. Для этого мы будем использовать цикл, чтобы пройтись по спискам и объединить их в один единый список. Это поместит все supplies в список и распределит количество элементов pads в соответствии с order из меморандума на складе.
for x in range(5): blue_crate.append(supplies[x]) blue_crate.append(pads[x]/order[x])
Несмотря на это, вы заметите, что будут появляться ошибки, даже если все сделано правильно и код корректен. Однако проблема заключается в том, что список supplies содержит только три (3) элемента, а цикл выполняется пять (5) раз, что вызывает Index Error. Между тем, список pads также содержит только три (3) элемента, и одно из значений в списке заказа равно 0, так как деление любого числа на 0 вызывает Zero Division Error, поскольку никакое число не может быть разделено на 0 в математике.
Именно здесь несколько исключений оказываются полезными, мы используем блоки кода try / except для отлавливания ошибок и продолжения работы программы. Поскольку может возникнуть две ошибки, нам необходимо идентифицировать каждую ошибку, чтобы отловить конкретные исключения. Это делается путем расширения блоков кода except следующим образом: except IndexError: и except ZeroDivisionError:. Например:
for x in range(5): try: blue_crate.append(supplies[x]) blue_crate.append(pads[x]/order[x]) except IndexError: blue_crate.append("glass bottle") except ZeroDivisionError: blue_crate.append(0)
Ошибка Index Error исправляется путем заполнения отсутствующих ячеек в списке строкой "glass bottle", а ошибка Zero Division Error устраняется путем добавления значения 0, если происходит недопустимое действие.
Сделайте то же самое для списков blue_crate = [], green_crate = [] и red_crate = []. Пройдите к темному знаку X на blue, green и red коврах и используйте функцию place(), чтобы разместить списки в соответствующих ящиках и завершить уровень.