Как исправить runtime error: причины и разбор по симптому

Как исправить runtime error: причины и разбор по симптому Полезное

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 и чинить

Порядок один и тот же для любого исключения.

  1. Прочитайте нижнюю строку traceback — там тип и текст ошибки (что случилось).
  2. Найдите строку File "...", line N с вашим файлом — это точка падения (в длинном traceback берите самую нижнюю строку со своим файлом, а не с библиотечным).
  3. Откройте эту строку и посмотрите, какая операция и над какими данными выполнялась.
  4. Сверьтесь с таблицей причин по типу исключения выше.
  5. Исправьте причину: проверка данных перед операцией или try / except там, где сбой ожидаем.
  6. Запустите снова с теми же данными, что вызвали падение, — убедитесь, что фикс сработал.

Когда сбой ожидаем и его нельзя исключить заранее (ввод, файл, сеть), причину не «чинят», а обрабатывают:

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 либо файлы самой программы. Лечится переустановкой приложения и установкой недостающих библиотек, к написанию кода отношения не имеет.

OTUS Журнал
Скидка 5% 14-20 сентября на курсы (popup)