Как читать сообщения об ошибках в Python: разбор Traceback по строкам

Ошибки Pythonобновлено 07.10.202610 мин чтенияесть тренажёр

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

Загружаем…

Ошибки Python — подсказка, а не наказание

Сообщение об ошибке — это не наказание, а подсказка: интерпретатор сообщает, на какой строке и почему он не смог продолжить. Чем раньше привыкнуть его читать, тем быстрее идёт работа.

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

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

Из чего состоит Traceback

Traceback — это отчёт о том, где программа была в момент остановки. Он состоит из 3 частей: заголовка, цепочки мест в коде и последней строки с типом ошибки.

Аня - средняя оценка: 4.666666666666667
Traceback (most recent call last):
  File "main.py", line 9, in <module>
    otchet("Боря", [])
  File "main.py", line 6, in otchet
    print(imya, "- средняя оценка:", srednee(ocenki))
  File "main.py", line 3, in srednee
    return sum(ocenki) / len(ocenki)
ZeroDivisionError: division by zero
ЧастьПримерЧто означает
ЗаголовокTraceback (most recent call last)«Трассировка, последний вызов внизу» — читать нужно снизу
МестоFile "main.py", line 3, in sredneeФайл, номер строки и функция, где выполнялся код
Строка кодаreturn sum(ocenki) / len(ocenki)Сама строка, на которой случилась остановка
Тип ошибкиZeroDivisionErrorНазвание класса ошибки — по нему ищут причину
Пояснениеdivision by zeroКороткое описание: здесь — «деление на ноль»

Первая строка вывода — «Аня - средняя оценка…» — к сообщению не относится. Это нормальный результат первого вызова: программа успела поработать до места остановки. Этим тоже стоит пользоваться: всё, что напечатано до Traceback, выполнилось правильно. Руководство PEP 8 советует давать функциям понятные имена, и в трассировке это окупается: по названию srednee сразу ясно, какой участок программы упал. В новых версиях Python под строкой кода могут стоять значки ^ или ~: они подчёркивают конкретную часть выражения. Описание формата трассировки есть в официальной документации Python[1].

Разбор ошибки Python за 5 шагов

Чтобы разобрать любое сообщение, пройдите 5 шагов: прочитать тип, перевести пояснение, найти строку, понять значения переменных и только потом менять код.

  1. Тип ошибки. Посмотрите на слово перед двоеточием в последней строке. По нему сразу понятно направление поиска: синтаксис, имена, типы, индексы. Значения всех стандартных названий собраны в документации Python.
  2. Пояснение. Переведите текст после двоеточия. В нём часто прямо названо имя переменной, ключ или метод, которого не хватает.
  3. Номер строки. Найдите нижний блок File … line … — это место остановки. Откройте эту строку в редакторе.
  4. Значения. Спросите себя, что лежало в переменных этой строки. В примере выше список ocenki был пуст, и len() вернула 0.
  5. Исправление. Решите, где правильно лечить: в строке остановки, выше по коду или в данных. Здесь логично проверить пустой список в функции srednee.
def srednee(ocenki):
    if not ocenki:
        return 0
    return sum(ocenki) / len(ocenki)

print(srednee([5, 4, 5]))
print(srednee([]))

Четвёртый шаг важнее всех. Тип ошибки говорит «что», номер строки — «где», но «почему» знает только тот, кто понимает, какие значения были в переменных. Если неясно, временно добавьте print() перед строкой остановки — гадать о значениях не стоит. Больше приёмов собрано в статье про отладку программ.

Номер строки: где искать на самом деле

Номер строки в сообщении — это место, где Python заметил проблему, а не всегда место, где её допустили. Для синтаксических ошибок виновата часто строка выше.

Синтаксические ошибки выглядят иначе: в них нет заголовка Traceback, потому что программа не успела запуститься. Python сначала читает весь файл и проверяет запись, и только потом выполняет. Если скобка не закрыта, интерпретатор может заметить это лишь на следующей строке или в конце файла. Значок ^ показывает примерное место, но смотреть стоит и чуть выше.

chisla = [1, 2, 3
print(sum(chisla))
  File "main.py", line 1
    chisla = [1, 2, 3
             ^
SyntaxError: '[' was never closed

Здесь сообщение указывает на открывающую скобку и прямо говорит, что она не закрыта. Старые версии Python в такой ситуации показывали на следующую строку с текстом «invalid syntax», и новички искали ошибку не там. Поэтому правило простое: если строка из сообщения выглядит правильной, проверьте строку над ней. Все варианты синтаксических сообщений собраны в разборе ошибки SyntaxError.

Несколько уровней: когда вызываются функции

Если программа вызывает функции, Traceback показывает всю цепочку вызовов сверху вниз: от основной программы до функции, где случилась остановка. Каждый уровень — 2 строки: место и код.

В примере с оценками цепочка из трёх звеньев: основная программа (<module>) вызвала otchet, та вызвала srednee, и уже там случилось деление на ноль. Нижний уровень показывает, где программа упала. Верхние — откуда туда пришли. Часто исправлять нужно не внизу, а на одном из верхних уровней: например, не передавать пустой список. Слово <module> означает основной код файла, не находящийся внутри функции. Исправлять верхние уровни нужно только после того, как понятна причина внизу. Как устроены функции и вызовы, рассказано в уроке про функции в Python.

Таблица частых ошибок Python

Большинство ошибок Python у школьников укладывается в 9 типов. Узнав тип в последней строке, сверьтесь с таблицей и откройте подробный разбор.

ТипЧто значитЧастая причина
SyntaxErrorНарушены правила записиСкобка, кавычка, двоеточие, = вместо ==
IndentationError и отступыНеверный отступНет сдвига после двоеточия, лишние пробелы
NameError: имя не определеноИмя не найденоОпечатка, регистр, переменная до создания
TypeError и типы данныхОперация не подходит для типаСложение строки с числом
ValueError при вводеТип верный, значение нетint("abc"), пустой ввод
ZeroDivisionErrorДеление на нольСреднее пустого списка
IndexErrorНет элемента с таким номеромИндекс равен длине списка
KeyErrorНет ключа в словареОпечатка или другой регистр в ключе
AttributeErrorНет метода у значенияappend у строки, None вместо списка

Все эти типы — встроенные исключения, их полный перечень с описаниями приведён в документации Python, которую выпускает Python Software Foundation. Тип ошибки в последней строке называется одинаково в любой среде: в IDLE, в терминале и в редакторе на сайте. Отличаться может только оформление вокруг последней строки.

Логические ошибки: Python молчит

Если программа работает, но выдаёт неверный ответ, — это логическая ошибка. Python о ней не сообщает: с его точки зрения всё в порядке, ведь каждая команда записана правильно.

Сюда относятся перепутанные знаки сравнения, неверная граница цикла, забытое приведение типа. Например, если сложить две строки «2» и «3», получится «23», и Python не возразит. Ещё один вид — зависание: программа не падает и не заканчивается. Как найти такой цикл, разобрано на странице про бесконечный цикл. Для логических ошибок не стоит ждать подсказок: проверяйте программу на примерах с заранее известным ответом, включая крайние случаи — ноль, пустую строку, одно число.

«Если сообщения нет, программа правильная». Это не подтверждается: отсутствие сообщения означает только, что Python смог выполнить каждую строку. Проверить смысл результата может только тест с известным ответом.

Поиск по тексту сообщения

Если тип и пояснение непонятны, скопируйте последнюю строку сообщения и найдите её текст в поиске или в документации. Свои имена переменных из запроса лучше убрать.

Пояснения к ошибкам стандартные, поэтому кто-то почти наверняка уже разбирал такое же. Но имена у всех свои: ocenki, vozrast, spisok. Если оставить их в запросе, совпадений будет меньше. Официальная документация Python тоже подходит для поиска: в разделе о встроенных исключениях есть каждое название. Удобный шаблон: тип ошибки, двоеточие, общая часть пояснения и слово «Python». Например: «TypeError can only concatenate str (not "int") to str Python». На английском найдётся больше разборов, но на русском тоже достаточно. Читая чужие решения, не копируйте их целиком: сначала поймите, почему ошибка возникла именно у вас.

Когда сообщение не поможет

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

  • Неверное значение пришло за 10 строк до остановки. Сообщение укажет на место, где значение использовали, а не где его испортили. Ищите выше через print().
  • Программа зависла и не выдаёт ни 1 сообщения. Это бесконечный цикл, и читать здесь нечего — нужна трассировка.
  • Ответ отличается от ожидаемого на 1. Логическая ошибка в границе цикла или индексе: Python считает всё правильным.
  • Файл называется так же, как 1 из модулей. Файл random.py в папке проекта ломает импорт, и сообщение выглядит загадочно.

Чего делать нельзя

Нельзя закрывать сообщение, не дочитав последнюю строку: в ней почти всегда есть половина ответа. Остальные правила — ниже.

  • Нельзя переписывать программу целиком из-за одной ошибки: найдите строку и исправьте её.
  • Не следует читать Traceback сверху и останавливаться на первом блоке: место остановки внизу.
  • Не стоит менять несколько мест сразу — после каждой правки запускайте программу заново.
  • Не допускается прятать сообщения пустым except: ошибка станет невидимой, но не исчезнет.
  • Не стоит игнорировать вывод до Traceback — он показывает, какая часть программы уже сработала.
  • Нельзя копировать чужое исправление, не поняв его: та же ошибка вернётся в следующей программе.

Источники

[1] The Python Tutorial (официальная документация Python 3). Python Software Foundation. — синтаксис и встроенные функции.

[2] ФИПИ. Методические рекомендации для обучающихся по организации индивидуальной подготовки к ОГЭ 2026 года. Информатика. М., 2026.

[3] van Rossum G., Warsaw B., Coghlan N. PEP 8 — Style Guide for Python Code. Python Software Foundation, 2001.

Вопросы и ответы

Что значит most recent call last?

«Последний вызов — внизу». Python перечисляет места в порядке вызова, поэтому самое свежее, где программа и остановилась, стоит в конце списка.

Почему сообщения на английском?

Так устроен сам Python, перевода в нём нет. Слов немного, и они повторяются: not defined, out of range, unsupported, expected. В редакторе на сайте рядом с сообщением появляется подсказка на русском.

Что делать, если ошибок Python в коде сразу несколько?

Python останавливается на первой. Исправьте её и запустите снова — появится следующая. Так и двигайтесь, по одной за раз.

Будет ли Traceback на экзамене?

В заданиях ОГЭ с программой на компьютере проверяют ответ, а не сообщения, но среда разработки покажет их так же[2]. Умение быстро прочитать ошибку экономит время на экзамене.

Чем предупреждение отличается от ошибки?

Предупреждение (Warning) сообщает о подозрительном месте, но программа продолжает работу. Ошибка останавливает выполнение. Редакторы также подсвечивают нарушения стиля PEP 8[3] — это не ошибки, а советы.

Как помочь ребёнку, если родитель не программирует?

Попросите прочитать вслух последнюю строку сообщения и перевести её. Уже этот шаг часто приводит к ответу, а родителю не нужно знать Python.