Поглиблений курс розробки на Python
Розділ
>
Рівень
Обробка виключень
Кілька виключень
Мета
Зібрати та правильно зберігати деякі медичні матеріали у ящиках за допомогою декількох обробників виключень.
Склади на даху потребують поповнення, деякі з матеріалів були використані, але так і не замінені. В одному зі складів в записці на столі є замовлення на додаткові матеріали, тому було б доцільно зайнятися цим. Проте існує безліч різних матеріалів, які потрібно зібрати та зберегти в ящиках.
Через різні типи даних і кількість матеріалів, необхідних для заповнення ящиків, ми можемо зіткнутися з помилками. Ми можемо використовувати try / except для перехоплення будь-яких можливих помилок і виправлення деяких із них, але що робити, коли під час однієї операції виникає кілька можливих помилок? Щоб вирішити це, ми можемо вказати, які саме виключення ми намагаємося перехопити, і використовувати кілька блоків except.
Для початку, підійдіть до золотого знаку X і зверніться до дверей, використовуйте функцію open() для входу в склад. Опинившись всередині, підійдіть до темного знаку X і поверніться праворуч, щоб використати функцію read() та перевірити, які матеріали та в яких кількостях замовляються в записці на столі. Інформація про константи списків записана в цій записці, включаючи матеріали та їх замовлення. Після цього, підійдіть до світлого знаку X всередині складу, поверніться до ящика і візьміть константу списку pads матеріалів, використовуючи функцію collect(), як показано тут: player.collect(pads) .
Всередині складу знаходяться запаси "peroxide" і "isopropyl", підійдіть і зберіть усі їх, потім вийдіть на вулицю і рушайте до темного знаку X через фіолетовий килим. На фіолетовому килимі, звернувшись до ящика, використайте функцію collect() для того, щоб зібрати "water bottle", а потім перемістіться до темного знаку X через жовтий килим і використайте функцію collect() для того, щоб зібрати "glass bottle".
Тепер, коли предмети зібрані, настав час виконати замовлення та розмістити всі матеріали всередині ящиків складу праворуч. Для цього спершу потрібно зберегти "water bottle", "peroxide" та "isopropyl" у списку з ім'ям supplies. На темних знаках X через килими red, green і blue ми будемо використовувати ящики для зберігання медичних матеріалів. Для цього ми створимо три списки: 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) елементи, але ще й одне з чисел у order дорівнює 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() для розміщення списків у відповідних ящиках, щоб завершити рівень.