Runtime error (ошибка времени выполнения) — это ошибка, из-за которой программа падает уже во время работы, после успешного запуска, а не при разборе кода. Код синтаксически корректен, интерпретатор принял его и начал выполнять, но на конкретной операции с конкретными данными выполнение прерывается исключением. Ниже разберем, чем runtime error отличается от синтаксической и логической ошибки, как читать traceback и как чинить каждый типовой случай. Примеры на Python, но принцип общий для любого языка.
Содержание
Runtime error, синтаксическая и логическая ошибка — в чем разница
Эти три вида ошибок легко спутать, а чинятся они по-разному. Разведем их явно.
| Вид ошибки | Когда проявляется | Программа запускается? | Пример |
|---|---|---|---|
| Синтаксическая (SyntaxError) | при разборе кода, до запуска | нет, не стартует | забыта скобка или двоеточие |
| Runtime error (исключение) | во время выполнения, на конкретной операции | да, но падает по ходу | деление на ноль, выход за границы списка |
| Логическая | во время выполнения, без падения | да, отрабатывает до конца | код рабочий, но результат неверный |
Короткая цепочка на одном коде. Строка if x = 0: не запустится вовсе — синтаксическая ошибка (нужно ==). Строка 10 / x при x = 0 запустится и упадет по ходу — runtime error. А sum(range(1, 10)), когда вы хотели сумму от 1 до 10, спокойно вернет 45 вместо 55 и не упадет — логическая ошибка (верная граница — range(1, 11)).
Вывод: синтаксическую ошибку показывает редактор до запуска, runtime error дает traceback при запуске, а логическую не поймает ни то, ни другое — только проверка результата.
Виды и причины runtime error
Runtime error в Python — это возбужденное исключение, и его тип в последней строке traceback прямо называет, что случилось. Вот исключения, на которые чаще всего натыкается начинающий.
| Исключение | Когда возникает | Типичная причина |
|---|---|---|
| ZeroDivisionError | деление на ноль | делитель из данных или ввода оказался нулем |
| TypeError | операция над несовместимыми типами | смешали строку и число (часто после input()) |
| ValueError | тип верный, а значение недопустимо | int("abc"), данные не того формата |
| IndexError | обращение к индексу вне диапазона | индекс больше или равен длине списка |
| KeyError | обращение к несуществующему ключу | ключа нет в словаре |
| NameError | использование необъявленного имени | опечатка в имени или переменная не создана |
| AttributeError | вызов несуществующего метода или атрибута | объект не того типа (часто None) |
| FileNotFoundError | открытие несуществующего файла | неверный путь или имя файла |
Общий признак почти всех случаев у новичка — данные: код проверен на «удобном» примере, а на реальном вводе (пустая строка, ноль, нет файла) операция становится недопустимой.
Как исправить runtime error: разбор по симптому
Дальше — типовые падения тройкой: неверный код, дословный вывод, исправление. Примеры проверены на Python 3.12; путь в traceback сокращен до app.py.
ZeroDivisionError: деление на ноль
Полный минимальный пример, который можно запустить. Программа считает среднюю цену.
prices = [100, 200, 300]
count = int(input("Сколько товаров? "))
average = sum(prices) / count
print("Средняя цена:", average)
Если ввести 0, программа падает:
Сколько товаров? 0
Traceback (most recent call last):
File "app.py", line 3, in <module>
average = sum(prices) / count
ZeroDivisionError: division by zero
Traceback читаем снизу вверх: тип и текст — ZeroDivisionError: division by zero, строка File "app.py", line 3 показывает точку падения. Причина — делитель count оказался нулем. Чиним не формулу, а данные: отсекаем недопустимый ввод.
prices = [100, 200, 300]
raw = input("Сколько товаров? ")
if not raw.isdigit() or int(raw) == 0:
print("Введите целое число больше нуля")
else:
count = int(raw)
print("Средняя цена:", sum(prices) / count)
Заодно raw.isdigit() закрывает ввод abc, который иначе дал бы ValueError: invalid literal for int() with base 10: 'abc'.
TypeError: строка и число вместе
Частая ловушка: input() всегда возвращает строку, даже если пользователь ввел число.
age = input("Возраст: ")
print("Через год: " + age + 1)
Возраст: 20
Traceback (most recent call last):
File "app.py", line 2, in <module>
print("Через год: " + age + 1)
TypeError: can only concatenate str (not "int") to str
Причина — Python не складывает строку и число. Исправление: явно привести age к числу, а к выводу перейти через запятую в print.
age = int(input("Возраст: "))
print("Через год:", age + 1)
IndexError: индекс за границей списка
a = [10, 20, 30]
print(a[3])
Traceback (most recent call last):
File "app.py", line 2, in <module>
print(a[3])
IndexError: list index out of range
Причина — в списке из трех элементов индексы 0, 1, 2, а 3 уже за границей. Исправление — обращаться к существующим индексам или проверять границу.
a = [10, 20, 30]
i = 3
if i < len(a):
print(a[i])
else:
print("Нет элемента с индексом", i)
KeyError: нет такого ключа в словаре
user = {"name": "Ann"}
print(user["age"])
Traceback (most recent call last):
File "app.py", line 2, in <module>
print(user["age"])
KeyError: 'age'
Причина — ключа age в словаре нет. Исправление — метод get() с значением по умолчанию вместо квадратных скобок.
user = {"name": "Ann"}
print(user.get("age", "не указан"))
Общий алгоритм: как читать traceback и чинить
Порядок один и тот же для любого исключения.
- Прочитайте нижнюю строку traceback — там тип и текст ошибки (что случилось).
- Найдите строку
File "...", line Nс вашим файлом — это точка падения (в длинном traceback берите самую нижнюю строку со своим файлом, а не с библиотечным). - Откройте эту строку и посмотрите, какая операция и над какими данными выполнялась.
- Сверьтесь с таблицей причин по типу исключения выше.
- Исправьте причину: проверка данных перед операцией или
try / exceptтам, где сбой ожидаем. - Запустите снова с теми же данными, что вызвали падение, — убедитесь, что фикс сработал.
Когда сбой ожидаем и его нельзя исключить заранее (ввод, файл, сеть), причину не «чинят», а обрабатывают:
raw = input("Число: ")
try:
print(100 / int(raw))
except ZeroDivisionError:
print("На ноль делить нельзя")
except ValueError:
print("Это не целое число")
Ловить стоит конкретные исключения, а не голый except: — иначе он проглотит и те ошибки, о которых вы не знаете.
Если не получилось
Диагностика по симптому — как обычно и ищут решение.
- Падает не всегда, а на определенных данных. Дело во входных данных: пустой ввод, ноль, отсутствующий файл. Добавьте проверку или
try / exceptименно на этот случай, а не на всю программу. - Traceback очень длинный, много строк
File. Ищите снизу последнюю строку со своим файлом — библиотечные строки выше лишь показывают путь вызова. RecursionError: maximum recursion depth exceeded. Рекурсия без условия выхода. Добавьте базовый случай, при котором функция перестает вызывать саму себя.- Программа зависает или
MemoryError. Слишком большой либо бесконечный цикл. Проверьте условие его завершения. - Ошибка пропала, но результат неверный. Это уже логическая ошибка, traceback тут не поможет — нужен отладчик или вывод промежуточных значений через
print.
Выводы
- Runtime error — это падение во время выполнения; синтаксическая ошибка ловится до запуска, логическая не роняет программу вовсе, а дает неверный результат.
- Тип исключения в последней строке traceback прямо называет причину, поэтому traceback читают снизу вверх.
- Большинство runtime error у начинающего — это данные: ввод, деление на ноль, выход за границы, отсутствующий ключ или файл.
- Чинить лучше причину (проверка данных перед операцией), а не глушить симптом голым
except. try / except— для ожидаемых сбоев (ввод, файл, сеть), а не как затычка на каждую строку; один и тот же разбор traceback работает для любого исключения.
Где применяется / связь с практикой
Освойте тему на практике
Чтение traceback и разбор исключений — базовый навык разработчика: в рабочем коде данные всегда «грязнее» тестовых. На курсе «Python-разработчик» отладка и разбор ошибок идут вместе с написанием кода, а не отдельной теорией. Посмотреть формат и уровень можно на бесплатных вебинарах — это открытые уроки без оплаты.
Смежные темы: Виды ошибок в программировании: баги, дефекты и сбои, Логические ошибки в программировании: виды и примеры, Дебаггинг: описание, особенности, методы реализации.
FAQ
Runtime error бывает только в Python? Нет, это класс ошибок в любом языке: в Java — исключения (Exception), в C и C++ — segmentation fault, в JavaScript — свои исключения. Тексты разные, а принцип один — падение во время выполнения.
Чем runtime error отличается от бага? Баг — любая ошибка в поведении программы. Runtime error — частный случай бага, который роняет программу с исключением. Логическая ошибка тоже баг, но программа при ней не падает, а выдает неверный результат.
А что за «Runtime Error» в окне обычной программы или игры на Windows? Это сообщение уже собранного приложения, а не вашего кода: чаще всего не хватает или повреждены библиотеки Visual C++ / .NET либо файлы самой программы. Лечится переустановкой приложения и установкой недостающих библиотек, к написанию кода отношения не имеет.



