Как обрабатывать исключения типа TypeError в Python?
Что проверяют
Не синтаксис try/except, а понимание, что TypeError почти всегда сигнал об ошибке в коде, а не штатная ситуация. Интервьюер хочет услышать, где такое исключение уместно ловить, а где его нужно пропустить наверх. Следом обычно спрашивают разницу между TypeError и ValueError.
Как отвечать
TypeError возникает, когда операция не поддерживает тип операнда: 1 + "a", вызов объекта, который не является функцией, неверное число аргументов. Если __add__ возвращает NotImplemented и обратная операция тоже не подходит, Python поднимает TypeError сам. ValueError означает, что тип подходящий, а значение нет: int("abc"). При этом int(None) даст именно TypeError.
Каркас ответа:
- ловить узко:
tryоборачивает одну строку, где тип может оказаться чужим, например разбор внешнего JSON. Тогдаexcept (TypeError, ValueError)честно означает «пришли плохие данные»; - на границе системы: входные данные проверяются при приёме (Pydantic,
isinstance, явные проверки), дальше код работает с корректными типами и ничего не ловит; - не глотать: обработка это преобразование в понятную ошибку уровня приложения через
raise InvalidInput(...) from eили запись черезlogger.exception, а неprintиreturn None; - бросать самим: функция, получившая аргумент неверного типа, сама поднимает
TypeErrorс понятным сообщением; - ловить до запуска: аннотации типов плюс mypy или pyright в CI находят большую часть таких ошибок ещё до выполнения.
Можно упомянуть подходы EAFP и LBYL: в Python принято пробовать и ловить, но только там, где ошибка ожидаема.
Где спотыкаются
Оборачивают в try большой блок. Тогда TypeError из бага во вложенной функции маскируется под «плохой ввод» и неделями не всплывает.
Пишут голый except: или except Exception, который перехватывает всё подряд и прячет трассировку.
Возвращают None из обработчика. Ошибка не исчезает, а переезжает дальше и падает как AttributeError: 'NoneType' в совсем другом месте.