Что такое исключения? Из названия понятно — они возникают, когда в программе происходит исключительная ситуация. Вы спросите, почему исключения — анти-паттерн, и как они вообще относятся к типизации? Я попробовал
разобраться, и теперь хочу обсудить это с вами, хабражители.
Проблемы исключений
Трудно найти недостатки в том, с чем сталкиваешься каждый день. Привычка и зашоренность превращает баги в фичи, но давайте попробуем взглянуть на исключения непредвзято.
Исключения трудно заметить
Существует два типа исключений: «явные» создаются при помощи вызова
raise
прямо в коде, который вы читаете; «скрытые» запрятаны в используемых функциях, классах, методах.
Проблема в том, что «скрытые» исключения и правда трудно заметить. Покажу на примере чистой функции:
def divide(first: float, second: float) -> float:
return first / second
Функция просто делит одно число на другое, возвращая
float
. Типы проверены и можно запустить что-то такое:
result = divide(1, 0)
print('x / y = ', result)
Заметили? На самом деле до
print
исполнение программы никогда не дойдет, потому что деление 1 на 0 – невозможная операция, она вызовет
ZeroDivisionError
. Да, такой код безопасен с точки зрения типов, но его все равно нельзя использовать.