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

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

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

В одном из первых уроков вы уже сталкивались с тем, что Python сообщает об ошибке: выводил что-то вроде «File "main.py", line 3» и название ошибки. Тогда речь шла о SyntaxError — проблемах, которые Python замечает ещё до запуска программы. Сейчас мы разбираем другой класс: ошибки времени выполнения. Программа стартует, что-то делает — и в какой-то момент падает с многострочным сообщением. Это сообщение называется traceback, и читать его — отдельный навык.

Структура traceback: что Python печатает при ошибке

Когда программа падает в момент выполнения, Python не просто выводит одну строку. Он печатает полный отчёт — traceback. Выглядит это примерно так:

Traceback (most recent call last):
  File "main.py", line 5, in <module>
    result = calculate(0)
  File "main.py", line 2, in calculate
    return 10 / x
ZeroDivisionError: division by zero

Разберём, из чего это состоит.

Первая строка всегда одна и та же:

Traceback (most recent call last):

Она сигнализирует: дальше идёт стек вызовов. Фраза «most recent call last» подсказывает порядок: внизу будет самый последний вызов — то есть именно то место, где всё сломалось.

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

Строка заголовка:

  File "main.py", line 2, in calculate

В ней три элемента: имя файла (File "main.py"), номер строки (line 2) и имя функции (in calculate).

Фрагмент кода — строка сразу под заголовком:

    return 10 / x

Это дословная выдержка из исходного файла — именно тот код, который выполнялся в данном кадре.

Если функций в цепочке несколько, кадров будет несколько. Самый нижний кадр — непосредственное место, где Python столкнулся с проблемой.

Последняя строка — это тип исключения и его описание:

ZeroDivisionError: division by zero

До двоеточия — имя класса ошибки (тип исключения). После двоеточия — короткое объяснение от Python. Именно с этой строки начинается диагностика: прочитав тип, уже можно понять природу проблемы, не вникая в весь стек.

Важно понять: traceback — не хаотичный вывод, а структурированный отчёт с фиксированной анатомией. Начало — всегда «Traceback (most recent call last):». Конец — всегда тип исключения. Всё между ними — цепочка вызовов, которая привела к ошибке.