Перейти к содержанию

412 уроков, 25 библиотек и челлендж «Что выведет код?» — бесплатно, код прямо в браузере

Начать обучение

Ошибки Python: как читать traceback и что делать

Ошибка в Python — не катастрофа, а сообщение: интерпретатор прямо говорит, что сломалось и где. Разобравшись в двенадцати самых частых сообщениях, вы перестанете гуглить текст ошибки и начнёте понимать, что произошло.

Вызвали переменную или функцию, которых нет в этой области видимости — часто опечатка или забытый import.

Код

total = prices['сыр']
print(totl)

Traceback

NameError: name 'totl' is not defined

Python ищет имя `totl` в локальной, потом в глобальной области — и не находит. Обратите внимание: ошибка про `totl`, а не про `total` — так вы сразу видите опечатку.

Проверьте написание и регистр: `total` и `totl` — разные имена. Плюс полезная привычка: включать в редакторе подсветку неопределённых имён (в PyCharm это работает из коробки).

Разбор темы: Область видимости

Как читать traceback

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

Traceback (most recent call last):
  File "shop.py", line 12, in <module>
    total = prices['сыр']
  File "shop.py", line 5, in count_total
    return sum(prices) + discount
KeyError: 'сыр'
  • KeyError: 'сыр' — что именно сломалось: тип ошибки и значение, которого не хватило.
  • Строки выше — цепочка вызовов: функция count_total вызвана из основного скрипта, упала на строке 5, а вызвали её со строки 12.
  • File "shop.py", line 5 — файл и строка, где произошла ошибка. Именно туда и идём читать код.

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

Частые вопросы об ошибках

Как читать traceback Python?
Traceback идёт снизу вверх: последняя строка — сама ошибка (тип и сообщение), над ней — строка кода, где она произошла, а выше — цепочка вызовов функций. Первым делом смотрите на последнюю строку: тип ошибки и сообщение объясняют, что случилось. Затем поднимитесь на строку выше и найдите в своём коде соответствующее место.
Что означает «IndexError: list index out of range»?
Вы обратились к элементу списка по индексу, которого нет. Чаще всего это off-by-one: в Python индексация начинается с нуля, поэтому у списка из трёх элементов допустимые индексы — 0, 1 и 2. Используйте enumerate, чтобы не считать индексы вручную.
Как обработать ошибку в Python?
Конструкция try/except позволяет перехватить исключение: try — блок, где может произойти ошибка, except — что делать, если произошла. Ловите конкретный тип ошибки (except ValueError), а не все подряд (except: — так вы спрячете и настоящие баги).
Нужно ли ловить все ошибки?
Нет. Обработчик нужен там, где ошибка ожидаема и с ней можно что-то сделать: пользователь ввёл не число, сети нет, файл не нашёлся. Ошибки в логике программы лучше не подавлять — пусть программа упадёт, пока вы чините, чем продолжит работать с неверными данными.