Чтение сообщений об ошибках и небольшой проект
Трассировку ошибки Python читают снизу: последняя строка указывает ошибку, а строка кода над ней показывает, где она произошла.
Мотылёк в журнале 1947 года
Сегодня большинство багов — это ошибки в коде, а 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Начни с последней строки. 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 вместо остановки |
- Какая строка отчёта об ошибке называет её тип?
- Первая строка
- Строка File
- Последняя строка
- Строка со знаками ^
- Какую ошибку вызывает
int("12a")?- TypeError
- ValueError
- NameError
- SyntaxError
- Какую ошибку вызывает
pritn("hi")?- SyntaxError
- NameError
- TypeError
- Ошибки нет
- Программа выводит строку 1, затем останавливается с ошибкой на строке 2. Какой тип ошибки не мог стать причиной?
- SyntaxError
- NameError
- TypeError
- ZeroDivisionError
- Что выведет этот код?
try: x = 10 / 0 except ZeroDivisionError: x = -1 print(x) - Что произойдёт при запуске этого кода?
print("start") print(5 / 0) print("end")- Выведет start и end
- Выведет start, затем остановится с ZeroDivisionError
- Остановится с ZeroDivisionError, ничего не выведя
- Выведет start, inf и end
- Программа работает без сообщений, но выводит неверную сумму. Какой это тип ошибки?
- SyntaxError
- Логическая ошибка
- NameError
- IndentationError
- Что выведет этот код?
spent = {"a": 4500, "b": 10000} print(30000 - sum(spent.values())) - Расположи строки этой небольшой программы по порядку, чтобы получить вывод ниже.Вывод
80.0 - Где ошибка? 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 останавливает программу до выполнения строки 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