Перейти до змісту

Довідник: Exceptions & Error Handling

Короткий довідник по обробці винятків у Python. Повний, поступово побудований конспект із наскрізним сценарієм — Урок 13. Виключення.

Синтаксис

try:
    result = risky()
except ValueError as e:        # конкретний тип + об'єкт помилки
    handle(e)
except (KeyError, IndexError): # кілька типів разом
    handle_missing()
except ZeroDivisionError:
    handle_zero()
else:                          # тільки якщо try пройшов без помилок
    use(result)
finally:                       # завжди — очищення ресурсів
    cleanup()

Шість головних винятків

Виняток Коли виникає Типовий приклад
ValueError Правильний тип, некоректне значення int("abc")
TypeError Несумісні типи в операції "x" + 5
ZeroDivisionError Ділення на нуль 10 / 0
IndexError Індекс списку поза межами lst[99] (3 елементи)
KeyError Ключ відсутній у словнику d["missing"]
FileNotFoundError Файл не знайдено open("ghost.txt")

raise — генерація власного винятку

def validate_age(age: int) -> int:
    if age < 0:
        raise ValueError("Вік не може бути від'ємним")
    return age

try:
    validate_age(-5)
except ValueError as e:
    print(e)   # Вік не може бути від'ємним

Поширення помилок (Stack Unwinding)

function_a()  ← try/except тут
    └── function_b()  ← немає обробника
            └── function_c()  ← 💥 виняток тут

Виняток піднімається: C → B → A → перехоплено ✅

Якщо ніхто не перехопить — програма падає з Traceback.

EAFP проти LBYL

# LBYL (не рекомендується в Python)
if key in my_dict:
    value = my_dict[key]

# EAFP (Python-стиль ✅)
try:
    value = my_dict[key]
except KeyError:
    handle_missing()

Антипатерн: «голий» except

# ❌ ПОГАНО — ховає всі баги, включно з опечатками
try:
    do_something()
except:
    pass

# ✅ ПРАВИЛЬНО — явно вказуємо, що перехоплюємо
try:
    do_something()
except ValueError:
    handle_value_error()

Ієрархія винятків (спрощено)

BaseException
├── KeyboardInterrupt   ← Ctrl+C
├── SystemExit          ← sys.exit()
└── Exception           ← усі звичайні помилки
    ├── ValueError
    ├── TypeError
    ├── ZeroDivisionError
    ├── IndexError
    ├── KeyError
    ├── FileNotFoundError
    └── ...

Warning

Ніколи не ловіть BaseException або голий except — це перехоплює навіть KeyboardInterrupt та SystemExit.

Далі

Контекстні менеджери (with), які гарантують finally-подібне закриття ресурсу навіть при винятку, розкриті в Довідник: File I/O та JSON і в Уроці 14.