Python · 3 мин

Как читать ошибки Python: от последней строки к причине

NameError, TypeError и ValueError на коротких примерах. Учимся находить причину, а не менять код наугад.

Что разберём

NameError, TypeError и ValueError на коротких примерах. Учимся находить причину, а не менять код наугад.

Сначала последняя строка

Когда программа печатает несколько строк с Traceback, это маршрут к месту сбоя. Начните с последней строки: там обычно указан класс исключения и пояснение. Затем найдите ближайшую строку вашего файла и её номер. В большом проекте выше могут быть вызовы библиотек — их не нужно переписывать только потому, что они появились в сообщении.

Сохраните ввод, который привёл к ошибке. Фраза «иногда не работает» почти не помогает проверке. Фраза «после ввода пустой строки падает преобразование количества» уже задаёт воспроизводимый случай.

Три похожие ситуации с разными причинами

В этих примерах задача одна — показать счёт игрока, но исправления разные. При NameError проверьте имя и порядок создания переменной; при TypeError — совместимость операций; при ValueError — содержимое значения.

Тип ошибки→Строка кода→Причина
Порядок чтения traceback: от сообщения внизу к указанному месту программы.
СообщениеПример причиныЧто проверить
NameErrorИспользовано points вместо scoreОпечатку и место присваивания
TypeError"Баллы: " + 5Типы с обеих сторон +
ValueErrorint("пять")Введённый текст

Исправьте пример, сохранив задачу

Здесь не нужен большой рефакторинг. Удобнее передать значения отдельными аргументами print: функция сама представит число как текст. Если поменять 5 на "5", пример тоже заработает, но переменная перестанет быть числом для последующего подсчёта.

Пример для практики
score = 5
# Неверно: print("Баллы: " + score)
print("Баллы:", score)
score = score + 2
print("После бонуса:", score)

SyntaxError: смотрите и на предыдущую строку

При синтаксической ошибке программа может вообще не начать выполнение. Указатель показывает, где интерпретатор обнаружил проблему, а не всегда место её возникновения. Если забыта закрывающая скобка, подсвеченной может оказаться следующая строка. Проверьте парность скобок и кавычек, двоеточие после if и отступы внутри блока.

Скопированный из чата текст иногда содержит типографские кавычки. Перепечатайте спорный символ в редакторе, а не заменяйте целые функции без необходимости.

Одна правка — одна проверка

Сделайте минимальное исправление и повторите исходный сценарий. Затем проверьте соседние случаи: ноль, пустой ввод, другое имя. Если менять одновременно названия, формулы и формат вывода, непонятно, какая правка помогла и что сломалось рядом.

Практика: в примере выше замените второе score на scores. Найдите ошибку по сообщению, верните имя и убедитесь, что итог снова 7. После этого намеренно добавьте строку "2" к числу. Сравните два сообщения: разные классы исключений указывают на разные вопросы.

из статьи — в свой проект

Разбор ошибок Python

Открой инструмент ZIPKA и попробуй пример из разбора. Он доступен бесплатно, без записи на курс.

Открыть инструмент ↗

Источники и дальнейшее чтение