На минулому уроці ми дізналися про винятки в Python. Винятки можуть у будь-який момент завершити виконання програми. Саме тому важливо обробляти винятки. Для цього в Python використовується блок try...except.
Конструкція try…except в Python
Блок try...except використовується для обробки винятків. Його синтаксис:
|
1 2 3 4 |
try: # Код, який може згенерувати виняток except: # Код для виконання у разі генерації винятку |
Код, який може згенерувати виняток, знаходиться всередині блоку try. За кожним блоком try слідує блок except. Коли виникає виняток, він перехоплюється блоком except.
Примітка: Блок except не може бути використаний без блоку try.
Приклад обробки винятку за допомогою try...except:
|
1 2 3 4 5 6 7 8 9 10 |
try: numerator = 10 denominator = 0 result = numerator/denominator print(result) except: print("Error: Denominator cannot be 0.") |
Результат:
Error: Denominator cannot be 0.
У цьому прикладі ми намагаємось поділити число на 0. Через це генерується виняток. Щоб обробити виняток, ми помістили код result = numerator/denominator всередині блоку try. Тепер, коли виникає виняток, решта коду всередині блоку try пропускається.
Блок except перехоплює виняток, і код всередині блоку except виконується. Якщо код у блоці try не генерує виняток, блок except пропускається.
Перехоплення специфічних винятків в Python
Для кожного блоку try може існувати від нуля і більше блоків except. Декілька блоків except дозволяють обробляти кожен виняток по-різному.
Тип аргументу кожного блоку except вказує на тип винятку, який може бути оброблений цим блоком. Наприклад:
|
1 2 3 4 5 6 7 8 9 |
try: even_numbers = [2,4,6,8] print(even_numbers[5]) except ZeroDivisionError: print("Denominator cannot be 0.") except IndexError: print("Index Out of Bound.") |
Результат:
Error: Index Out of Bound
Тут ми створили список з ім’ям even_numbers.
Оскільки перший елемент списку знаходиться під індексом 0, останній елемент списку знаходиться під індексом 3. Зверніть увагу на стейтмент:
|
1 |
print(even_numbers[5]) |
Тут ми намагаємося отримати доступ до елемента під індексом 5. Отже, виникає виняток IndexError.
Коли виняток IndexError виникає у блоці try:
виняток ZeroDivisionError пропускається;
виконується код всередині винятку IndexError.
Конструкція try з умовою else в Python
У деяких ситуаціях може знадобитися виконати певний блок коду, якщо код всередині try виконається без помилок. Для таких випадків використовується необов’язкове ключове слово else разом з оператором try. Наприклад:
|
1 2 3 4 5 6 7 8 9 10 |
try: num = int(input("Enter a number: ")) assert num % 2 == 0 except: print("Not an even number!") else: reciprocal = 1/num print(reciprocal) |
Результат:
Якщо ми передаємо непарне число:
Enter a number: 1
Not an even number!
Якщо ми передаємо парне число, то обчислюється значення:
Enter a number: 4
0.25
Однак, якщо ми передамо 0, то отримаємо помилку ZeroDivisionError, оскільки код всередині else не обробляється попереднім except:
Enter a number: 0
Traceback (most recent call last):
File "<string>", line 7, in <module>
reciprocal = 1/num
ZeroDivisionError: division by zero
Примітка: Винятки у блоці else не обробляються попередніми блоками except.
Конструкція try…finally в Python
В Python блок finally виконується завжди, незалежно від того, генерується виняток чи ні. Блок finally є необов’язковим. І для кожного блоку try може бути лише один блок finally. Наприклад:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
try: numerator = 10 denominator = 0 result = numerator/denominator print(result) except: print("Error: Denominator cannot be 0.") finally: print("This is finally block.") |
Результат:
Error: Denominator cannot be 0.
This is finally block.
Тут ми ділимо число на 0 всередині блоку try. При цьому генерується виняток, який перехоплюється блоком except. Потім виконується блок finally.
