Перейти до основного вмісту
Модуль 2 · Урок 4 із 48/36 у курсі~12 min
Модульні уроки (4/4)

Обробка помилок: try/except

Коли щось йде не так під час виконання (ділення на нуль, відсутній ключ, an операція з несумісними типами) Python створює виняток. без обробка, виняток перериває програму. З try / except ви може зловити це і вирішити, що робити.

Основна форма

Python
try:
    risultato = 10 / 0
except ZeroDivisionError:
    risultato = None
risultato  # None
  • блок try: містить код, який може вийти з ладу;
  • except <ErrorType>: виконується лише якщо виникає помилка цього типу всередині try.

Перехоплення повідомлення про винятки

Використовуйте as, щоб прив’язати об’єкт винятку до імені:

Python
try:
    int("non è un numero")
except ValueError as e:
    messaggio = str(e)
messaggio  # "invalid literal for int() with base 10: 'non è un numero'"

Кілька типів разом

Python
try:
    valore = dati[chiave]
except (KeyError, IndexError):
    valore = None

Кортеж типів ловить будь-які винятки цих типів (або підкласів).

Повна структура: try/except/else/finally

Python
try:
    n = int("42")
except ValueError:
    print("not a number")
else:
    print(f"parsed: {n}")     # executed only if NO exception occurred
finally:
    print("always executed")  # executed regardless, even on exception
  • else — використовуйте його для коду, який залежить від успіху try. Залиште це розділити, щоб випадково не перехопити непов’язані винятки.
  • finally — очищення, яке повинно відбуватися завжди (закриття файлу, звільнення ресурс). Виконується як в разі успіху, так і в разі помилки.

Створення винятку: raise

Іноді саме ви хочете повідомити, що щось пішло не так:

Python
def diviso(a, b):
    if b == 0:
        raise ValueError("the divisor cannot be zero")
    return a / b

Найпоширеніші вбудовані винятки, з якими ви зіткнетеся:

  • ValueError — значення має правильний тип, але є неприйнятним (наприклад, аналіз).
  • TypeError — тип неправильний (наприклад, len(42)).
  • KeyError / IndexError — відсутній ключ/індекс.
  • ZeroDivisionError — ділення на нуль.
  • FileNotFoundError, PermissionError — операції з файловою системою.

Речення else і finally у блоках try

Блок try може визначати два додаткових положення:

  • else: виконується, лише якщо блок try завершується без виклику будь-яких винятків.
  • finally: виконується завжди, незалежно від того, чи сталася виняткова ситуація. Це ідеально підходить для очищення ресурсів (наприклад, закриття відкритого файлу або підключення до бази даних).

Спробуйте самі

вправи#python.m2.l4.e1
Спроби: 0Завантаження…

Напишіть вираз, який намагається int('abc'): якщо виникає ValueError, призначте рядок 'errore' до `result`; інакше призначити номер. Оцініть `результат`.

Завантаження редактора…
Показати підказку

int('abc') викликає ValueError.

Рішення доступне після 3 спроб

Повторна вправа

вправи#python.m2.l4.e2
Спроби: 0Завантаження…

Визначте `divide(a, b)`, який повертає a/b, але викликає ValueError із повідомленням 'divisore zero', якщо b дорівнює 0. Потім викличте divide(10, 0) усередині try/except і призначте `message` рядок перехопленого винятку.

Завантаження редактора…
Показати підказку

підняти ValueError('...') всередині функції; catch з крім ValueError як e.

Рішення доступне після 3 спроб

Додатковий виклик

вправи#python.m2.l4.e3
Спроби: 0Завантаження…

Напишіть блок \`try-except\`, щоб перетворити рядок \`text_val = "abc"\` на ціле число. Якщо перетворення викликає \`ValueError\`, призначте \`None\` для \`result\`. В іншому випадку призначте перетворений номер. Нарешті, оцініть \`результат\`.

Завантаження редактора…
Показати підказку

Використовуйте try: result = int(text_val), а потім крім ValueError: result = None.

Рішення доступне після 3 спроб