Coding for KidsCoding for Kids
Креативні РівніВикликиПосібник для Вчителів
Голосувати за функції
Поглиблений курс розробки на 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 та final і їх різними комбінаціями для виправлення коду з помилками. Наприклад, для 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 у ящику для завершення рівня.

Книга Коду