Ошибки и отладка

Чтение traceback и типичные ошибки

Содержание курса

NameError, TypeError, ZeroDivisionError: причины и сообщения

Тип исключения в последней строке traceback — это не просто название. По нему можно сразу предположить причину, ещё до того как откроешь файл с кодом. Разберём три исключения, которые встречаются чаще всего.

NameError

Появляется, когда Python встречает имя, которое ему неизвестно. Самое частое объяснение: опечатка в имени переменной или функции, либо переменная используется раньше, чем ей что-то присвоили.

Сообщение всегда выглядит так:

NameError: name 'reslt' is not defined

В кавычках — то имя, которое Python не смог найти. Именно на него и нужно смотреть: либо оно написано с ошибкой, либо нигде не создавалось.

Важный нюанс: Python не проверяет имена заранее при запуске. Он доходит до строки с неизвестным именем в момент выполнения — и только тогда бросает NameError. Поэтому ошибка может появиться в середине работы программы, а не сразу.

TypeError

Появляется, когда операция несовместима с типами участвующих значений. Самый классический сценарий — попытка соединить строку и число через +:

TypeError: can only concatenate str (not "int") to str

По сообщению сразу понятно: Python ожидал строку, а получил int. Другой распространённый вариант — передать в функцию аргумент не того типа, который она ожидает.

Отличительная черта TypeError: Python не догадывается о намерении. Если написано 'Возраст: ' + 25, он не пытается автоматически привести 25 к строке — он останавливается и сообщает о конфликте типов.

ZeroDivisionError

Появляется ровно в одном случае: делитель оказался равен нулю. Не важно, откуда взялся ноль — из переменной, из вычисления, из ввода пользователя. Как только Python вычисляет выражение с / или // и видит ноль в знаменателе — бросает исключение:

ZeroDivisionError: division by zero

Сообщение здесь всегда одинаковое и не содержит лишних деталей. Всю информацию о где даёт кадр стека над ним.

Важный момент: ошибка возникает в момент вычисления, а не когда переменная получает значение 0. То есть y = 0 само по себе не падает — падает x / y на следующей строке.


Каждый из трёх типов говорит о принципиально разной проблеме:

  • NameError → неизвестное имя (опечатка или порядок выполнения)
  • TypeError → конфликт типов в операции
  • ZeroDivisionError → арифметически недопустимое действие

Этот словарь работает в обе стороны: читая traceback, ты по типу исключения сразу знаешь, что искать в коде.