edubun
Русский

Чтение сообщений об ошибках и небольшой проект

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

Мотылёк в журнале 1947 года

КонтекстВ 1947 году инженеры, работавшие с компьютером Mark II в Гарвардском университете, обнаружили мотылька, застрявшего в одном из компонентов. Они приклеили насекомое в рабочий журнал и подписали: «Первый случай обнаружения настоящего bug». Сейчас страница хранится в Национальном музее американской истории Смитсоновского института. В описании музея уточняются две популярные детали. Небольшие неисправности инженеры называли bugs задолго до этого; Томас Эдисон употреблял слово ещё в 1870-х годах. Так что термин возник не из-за мотылька: шутка понятна именно потому, что слово уже существовало. Грейс Хоппер, работавшая в тот год в команде Mark II, скорее всего, не вела этот журнал, хотя она и её коллеги помогли сделать слова bug и debug привычными для программистов.

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

Читай отчёт об ошибке снизу вверх

total = 0
count = 0
print(total / count)
Вывод
Traceback (most recent call last):
  File "main.py", line 3, in <module>
    print(total / count)
          ~~~~~~^~~~~~~
ZeroDivisionError: division by zero
Читай в порядке 1, 2, 3: тип и сообщение об ошибке в последней строке, затем файл и номер строки, затем отмеченный фрагмент кода.

Начни с последней строки. ZeroDivisionError: division by zero даёт тип ошибки и краткое объяснение. Поднимись к строке File: там имя файла (на твоём компьютере будет полный путь, здесь он сокращён до main.py) и номер строки, 3. Под ней находится сам код, а Python 3.12 отмечает ошибочную операцию знаком ^ под /. Только прочитав все три части, начинай что-то менять. Если ошибка произошла в функции, в отчёте перечисляются все вызовы на пути к ней; обычно сначала стоит смотреть на самую нижнюю строку File.

ОшибкаОбычная причинаПример
SyntaxErrorНедопустимая строка Python: пропущена скобка, двоеточие или кавычкаprint("hi"
IndentationErrorНет отступа или отступы неодинаковыif x > 1: без строки с отступом
NameErrorИмя ещё не существует, часто из-за опечаткиpritn("hi")
TypeErrorОперация над неподходящим типом"Age: " + 15
ValueErrorТип верный, значение недопустимоint("abc")
IndexErrorИндекс за границей списка или строки[1, 2][2]
KeyErrorКлюча нет в словаре{"a": 1}["b"]
ZeroDivisionErrorДеление на ноль5 / 0

SyntaxError отличается от остальных ошибок. Python находит её до начала выполнения, поэтому не выполняется даже строка 1, а заголовка Traceback нет. Все остальные ошибки возникают во время работы программы, когда предыдущие строки уже выполнились. Если ты ожидаешь конкретную ошибку, её можно перехватить с помощью try и except, описанных в главе учебника об ошибках. Python пытается выполнить блок с отступом; при этой ошибке он выполняет блок except вместо остановки.

print("before")
n = int("abc")
print("after")
Вывод
before
Traceback (most recent call last):
  File "main.py", line 2, in <module>
    n = int("abc")
        ^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'abc'
text = "abc"
try:
    n = int(text)
except ValueError:
    n = 0
print(n)
Вывод
0

Самые трудные ошибки не вызывают никаких сообщений. Логическая ошибка означает, что программа работает, но выводит неверный ответ, как программа оценок из урока об if, выдававшая C за 85 баллов. Python не знает твоего замысла. Вернись к таблице трассировки или временно добавь print для вывода переменных на каждом шаге, а после нахождения ошибки убери их.

Небольшой проект: журнал карманных расходов

В проекте есть что-то почти из каждого урока: словарь расходов, функция, возвращающая сумму, цикл for, f-строка и if. Набери код, запусти, затем переделай под себя: замени покупки, добавь категорию или предупреждение, если одна покупка стоит больше половины карманных денег.

def total(spent):
    t = 0
    for amount in spent.values():
        t += amount
    return t

allowance = 30000
spent = {"snacks": 4500, "bus card": 10000, "notebook": 2500}
used = total(spent)
left = allowance - used
for item, amount in spent.items():
    print(f"{item}: {amount} won")
print(f"Spent {used}, left {left}")
if left < 15000:
    print("Less than half left")
Вывод
snacks: 4500 won
bus card: 10000 won
notebook: 2500 won
Spent 17000, left 13000
Less than half left

Перед изменениями составь таблицу трассировки для used и left и предскажи результат добавления покупки за 6000 вон. Затем намеренно создай ошибки: удали двоеточие после строки def, один раз напиши spent с опечаткой и раздели used на ноль. Перед исправлением прочитай каждый отчёт снизу. Умение сломать программу и снова починить её и есть навык, который ты развивал в этом курсе.

отчёт об ошибке (traceback)Отчёт Python об ошибке; читай снизу
SyntaxErrorНедопустимый код, обнаруженный до начала выполнения
NameErrorНесуществующее имя, часто из-за опечатки
TypeErrorОперация над значением неподходящего типа
ValueErrorВерный тип с недопустимым значением, например int("abc")
логическая ошибкаРаботает без сообщения, но даёт неверный ответ
try / exceptПри ожидаемой ошибке выполняет блок except вместо остановки
  1. Какая строка отчёта об ошибке называет её тип?
    • Первая строка
    • Строка File
    • Последняя строка
    • Строка со знаками ^
  2. Какую ошибку вызывает int("12a")?
    • TypeError
    • ValueError
    • NameError
    • SyntaxError
  3. Какую ошибку вызывает pritn("hi")?
    • SyntaxError
    • NameError
    • TypeError
    • Ошибки нет
  4. Программа выводит строку 1, затем останавливается с ошибкой на строке 2. Какой тип ошибки не мог стать причиной?
    • SyntaxError
    • NameError
    • TypeError
    • ZeroDivisionError
  5. Что выведет этот код?
    try:
        x = 10 / 0
    except ZeroDivisionError:
        x = -1
    print(x)
  6. Что произойдёт при запуске этого кода?
    print("start")
    print(5 / 0)
    print("end")
    • Выведет start и end
    • Выведет start, затем остановится с ZeroDivisionError
    • Остановится с ZeroDivisionError, ничего не выведя
    • Выведет start, inf и end
  7. Программа работает без сообщений, но выводит неверную сумму. Какой это тип ошибки?
    • SyntaxError
    • Логическая ошибка
    • NameError
    • IndentationError
  8. Что выведет этот код?
    spent = {"a": 4500, "b": 10000}
    print(30000 - sum(spent.values()))
  9. Расположи строки этой небольшой программы по порядку, чтобы получить вывод ниже.
    Вывод
    80.0
  10. Где ошибка? def avg(nums): return sum(nums) / len(nums), вызов avg([]).
    • sum для пустого списка вызывает ошибку
    • len([]) равно 0, поэтому происходит деление на ноль
    • В return нельзя использовать деление
    • Ошибки нет
Частые ошибки
  • «Ошибка в строке, названной в сообщении, значит, исправлять нужно её». Часто, но не всегда. В уроке о функциях x = show_area(4, 3), за которым следует x * 2, вызывает TypeError на строке x * 2. Настоящая ошибка при этом находится внутри show_area: вместо print нужен return. Прочитай указанную строку, затем выясни, откуда пришли её значения.
  • «Если обернуть всё в try/except, ошибки исправятся». Это лишь скроет их. Перехватывай конкретную ожидаемую ошибку, например ValueError из int(input()), и осмысленно обрабатывай её.
  • «Нет сообщения об ошибке, значит, программа верна». Логические ошибки не вызывают сообщений. Проверяй программу на данных с заранее известным ответом, включая особые случаи вроде пустого списка или граничного возраста.
Заметка для учителяСделай сообщения об ошибках привычными. Полезный порядок: перед исправлением ученик читает вслух последнюю строку, называет номер строки, затем указывает на знаки ^. Намеренно сломанные программы с одной SyntaxError, одной NameError и одной TypeError подходят для быстрой разминки. В корейской школьной программе по информатике предусмотрены анализ результатов отладчиком и исправление ошибок. В IDLE простой отладчик находится в меню Debug, но на этом уровне print и таблицы трассировки решают ту же задачу. Проект карманных расходов соответствует следующему стандарту, «решение жизненной задачи с помощью программы»; его можно переделать под бюджет перекусов класса или журнал чтения.
Главное
  • Читай отчёт снизу: тип ошибки, затем файл и строка, затем отмеченный код.
  • SyntaxError останавливает программу до выполнения строки 1; остальные ошибки останавливают её посреди работы.
  • try/except обрабатывает ожидаемую ошибку.
  • Логические ошибки не дают сообщений: отслеживай значения и проверяй на известных ответах.
  • Отладка означает намеренно ломать и чинить, пока сообщения не станут привычными.
Источники курса (6)
  • Python Software Foundation, The Python Tutorial for Python 3.12 (docs.python.org/3.12/tutorial: 2 Using the Python Interpreter, 3 An Informal Introduction to Python (numbers, text, lists), 4 More Control Flow Tools (if, for, range, break and continue, defining functions, default argument values, 4.10 coding style: 4-space indentation), 5 Data Structures (list methods, 5.5 dictionaries, insertion order), 8 Errors and Exceptions (syntax errors, exceptions, reading the traceback, handling exceptions), 15 Floating-Point Arithmetic (0.1 + 0.2))
  • Built-in Functions (docs.python.org/3.12/library/functions.html: print, input, len, int, float, str, type, round (round half to even: round(0.5) and round(-0.5) are 0, round(1.5) is 2), range, sum, min, max, sorted)
  • Built-in Types (str methods upper, lower, replace, strip; dict.get; list.append, pop, remove, sort returning None)
  • General Python FAQ (docs.python.org/3.12/faq/general.html: Guido van Rossum began Python in the 1989 Christmas holidays, posted it to USENET in February 1991, named it after Monty Python's Flying Circus)
  • Curriculum for the Korean pages: 교육부 고시 제2022-33호 [별책 10] 정보과 교육과정 (PDF read 2026-10-19: 중학교 정보 [9정03-05] 리스트 등 데이터를 순차적으로 저장하는 구조, [9정03-06] 논리 연산과 중첩 제어 구조, [9정03-07] 함수 활용과 디버거로 오류 수정, [9정03-08] 실생활 문제를 프로그래밍으로 해결, 적용 시 고려 사항 「학생의 수준을 고려하여 적합한 프로그래밍 언어를 선정」; 고등학교 정보 [12정03-04] 자료형, [12정03-05] 표준입출력, [12정03-07] 제어 구조)
  • Bug story only: Smithsonian National Museum of American History, Log Book With Computer Bug, 1947, Harvard Mark II, "first actual case of bug being found", probably not Hopper's log book (americanhistory.si.edu/collections/object/nmah_334663, read 2026-10-19)

Проверено: 2026-10-19