Что такое ошибка времени выполнения?
Ошибка времени выполнения (runtime error) возникает, когда программа уже работает и операцию нельзя выполнить с имеющимися значениями, например при делении на ноль или чтении за концом списка. Если ошибку не обработать, программа останавливается на этой строке.
Обновлено 24 сентября 2026 г.
Ошибка времени выполнения ждёт, пока программа уже запущена. Код проходит все проверки перед стартом, какое-то время работает правильно, а потом доходит до операции, которую нельзя выполнить с теми значениями, что есть в этот момент. Эта функция работает для одного списка и ломается на другом:
85.0
Traceback (most recent call last):
File "main.py", line 5, in <module>
print(average([]))
^^^^^^^^^^^
File "main.py", line 2, in average
return sum(scores) / len(scores)
~~~~~~~~~~~~^~~~~~~~~~~~~
ZeroDivisionError: division by zero
Первый вызов выводит 85.0. Второй вызов передаёт пустой список, поэтому len(scores) равно 0, и деление невозможно. С грамматикой всё было в порядке, так что это не синтаксическая ошибка. Проблема существует только для определённых данных, и поэтому ошибка времени выполнения может появиться после того, как программа сто раз отработала правильно.
Что происходит, когда возникает ошибка времени выполнения
- Программа доходит до операции, здесь это
sum(scores) / len(scores). - Среда выполнения проверяет её перед выполнением. CPython проверяет делитель перед делением, JVM проверяет каждый индекс массива, а Python проверяет, что ключ словаря существует, прежде чем вернуть его значение.
- Проверка не проходит, и среда выполнения создаёт объект ошибки. В Python и Java этот объект называется исключением, и в нём записаны тип ошибки, сообщение и место, где она произошла.
- Среда выполнения ищет код, который обрабатывает ошибку этого типа: сначала в текущей функции, потом в функции, которая её вызвала, и так далее наружу.
- Если обработчика нет, программа останавливается. Python выводит traceback и завершается с кодом 1. Java выводит трассировку стека, которая начинается с
Exception in thread "main".
Языки без таких проверок ведут себя иначе. C не проверяет индексы массивов и указатели, поэтому неверное обращение к памяти либо незаметно портит данные, либо приводит к тому, что операционная система завершает программу с ошибкой сегментации.
Всё, что программа сделала до строки с ошибкой, уже произошло. Этот цикл выводит три цвета и только потом падает на четвёртом:
red
green
blue
Traceback (most recent call last):
File "main.py", line 4, in <module>
print(colors[i])
~~~~~~^^^
IndexError: list index out of range
Как читать traceback
Traceback в Python читают снизу вверх. Последняя строка называет тип ошибки и сообщение: ZeroDivisionError: division by zero. Строки выше перечисляют цепочку вызовов, от самого старого к самому последнему. В первом примере строка 5 вызвала average, а в строке 2, внутри average, деление и не удалось.
Строка, где произошла ошибка, не всегда та, которую нужно менять. Строка 2 в average правильная. Настоящий вопрос в том, как туда попал пустой список, поэтому проследи неверное значение до места, откуда оно пришло, и исправляй там. Если traceback проходит через файлы библиотек, которые писал не ты, ищи последнюю строку, указывающую на твой собственный файл.
Частые ошибки времени выполнения
Каждое из этих сообщений скопировано из Python 3.12.
| Ошибка | Пример | Сообщение |
|---|---|---|
ZeroDivisionError | 10 / 0 | division by zero |
IndexError | ["red", "green", "blue"][3] | list index out of range |
KeyError | {"theme": "dark"}["font"] | 'font' |
ValueError | int("twenty") | invalid literal for int() with base 10: 'twenty' |
TypeError | "Total: " + 5 | can only concatenate str (not "int") to str |
AttributeError | вызов .upper() у None | 'NoneType' object has no attribute 'upper' |
FileNotFoundError | open("missing.txt") | [Errno 2] No such file or directory: 'missing.txt' |
RecursionError | функция, которая вызывает себя бесконечно | maximum recursion depth exceeded |
В Java есть прямые аналоги, например ArithmeticException, ArrayIndexOutOfBoundsException, NumberFormatException и NullPointerException. Целочисленное деление на ноль, которое никто не перехватил, выводит в Java вот что:
Exception in thread "main" java.lang.ArithmeticException: / by zero
JavaScript снисходительнее к числам: 10 / 0 даёт Infinity, а не ошибку. Он падает, когда ты используешь значение, которого нет. Node.js выводит это для user.name, когда user равно undefined:
TypeError: Cannot read properties of undefined (reading 'name')
Как исправить ошибку времени выполнения
- Воспроизведи её. Запусти программу снова с теми же входными данными и убедись, что получаешь ту же ошибку.
- Прочитай последнюю строку traceback, затем найди соответствующую строку в своём коде.
- Посмотри на задействованные значения. Выведи их прямо перед строкой с ошибкой или остановись там на точке останова отладчика.
- Исправь причину. Поправь индекс, обработай особый случай или проверь входные данные перед использованием.
Для функции average исправление в том, чтобы решить, каким должно быть среднее при отсутствии оценок, и записать это в коде:
85.0
0
Некоторые сбои от тебя не зависят: файл, который удалили, сеть, которая не ответила вовремя, пользователь, который ввёл буквы вместо числа. Исправлением кода их не предотвратить, поэтому их перехватывают с помощью обработки исключений и решают, что программа сделает дальше. Чего делать не стоит, так это оборачивать баг в try и прятать его. IndexError из цикла, который делает на один шаг больше, это ошибка, которую нужно исправить, а не перехватить.
Сообщения о runtime error в Windows и Excel
Этот термин встречается и за пределами твоего собственного кода. Окно Windows с заголовком Microsoft Visual C++ Runtime Library и словами Runtime Error! означает, что программа на C++ столкнулась с фатальной ошибкой и среда выполнения C++ её завершила. Как пользователь ты не можешь изменить этот код, поэтому обычно помогает обновление программы, восстановление или переустановка пакетов Microsoft Visual C++ Redistributable, а для игр ещё и обновление драйвера видеокарты.
Макросы Excel на VBA сообщают о пронумерованных ошибках времени выполнения. Run-time error '9': Subscript out of range означает, что макрос запросил лист или элемент массива, которого не существует, а Run-time error '1004' это общая ошибка, которая возникает, когда не удаётся операция над книгой, листом или диапазоном. Суть та же, что и в Python: правильный код встретил значение, с которым не смог справиться.
Что читать дальше
У ошибок времени выполнения две родственницы: синтаксическая ошибка, которая находится до запуска программы, и логическая ошибка, которая вообще не выдаёт сообщения. Чтобы восстанавливаться после ошибок времени выполнения, а не падать, прочитай про обработку исключений, а затем руководства по Python об исключениях и отладке ошибок. В курсе Python ты пишешь и исправляешь такой код в каждом уроке.
Часто задаваемые вопросы
Чем ошибка времени выполнения отличается от синтаксической?
Почему у меня постоянно возникают ошибки времени выполнения?
Что означает Runtime Error на LeetCode?
None, либо рекурсия настолько глубокая, что стек переполняется. Запусти сам входные данные, показанные на странице результатов, и проверь крайние случаи: пустой массив, один элемент и максимальный допустимый размер.Ошибка времени выполнения и исключение это одно и то же?
RuntimeException к тому же название одного конкретного семейства исключений, непроверяемых, например NullPointerException.