Menu
Coddy logo textTech

Что такое ошибка времени выполнения?

Ошибка времени выполнения (runtime error) возникает, когда программа уже работает и операцию нельзя выполнить с имеющимися значениями, например при делении на ноль или чтении за концом списка. Если ошибку не обработать, программа останавливается на этой строке.

Автор: Kevin Spektor, Сооснователь и CTO

Обновлено 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, и деление невозможно. С грамматикой всё было в порядке, так что это не синтаксическая ошибка. Проблема существует только для определённых данных, и поэтому ошибка времени выполнения может появиться после того, как программа сто раз отработала правильно.

Что происходит, когда возникает ошибка времени выполнения

  1. Программа доходит до операции, здесь это sum(scores) / len(scores).
  2. Среда выполнения проверяет её перед выполнением. CPython проверяет делитель перед делением, JVM проверяет каждый индекс массива, а Python проверяет, что ключ словаря существует, прежде чем вернуть его значение.
  3. Проверка не проходит, и среда выполнения создаёт объект ошибки. В Python и Java этот объект называется исключением, и в нём записаны тип ошибки, сообщение и место, где она произошла.
  4. Среда выполнения ищет код, который обрабатывает ошибку этого типа: сначала в текущей функции, потом в функции, которая её вызвала, и так далее наружу.
  5. Если обработчика нет, программа останавливается. 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.

ОшибкаПримерСообщение
ZeroDivisionError10 / 0division by zero
IndexError["red", "green", "blue"][3]list index out of range
KeyError{"theme": "dark"}["font"]'font'
ValueErrorint("twenty")invalid literal for int() with base 10: 'twenty'
TypeError"Total: " + 5can only concatenate str (not "int") to str
AttributeErrorвызов .upper() у None'NoneType' object has no attribute 'upper'
FileNotFoundErroropen("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')

Как исправить ошибку времени выполнения

  1. Воспроизведи её. Запусти программу снова с теми же входными данными и убедись, что получаешь ту же ошибку.
  2. Прочитай последнюю строку traceback, затем найди соответствующую строку в своём коде.
  3. Посмотри на задействованные значения. Выведи их прямо перед строкой с ошибкой или остановись там на точке останова отладчика.
  4. Исправь причину. Поправь индекс, обработай особый случай или проверь входные данные перед использованием.

Для функции 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?
Это значит, что решение скомпилировалось, но упало хотя бы на одном тесте. Обычные причины: индекс вне диапазона, деление на ноль, использование значения null или None, либо рекурсия настолько глубокая, что стек переполняется. Запусти сам входные данные, показанные на странице результатов, и проверь крайние случаи: пустой массив, один элемент и максимальный допустимый размер.
Ошибка времени выполнения и исключение это одно и то же?
Не совсем. В Python и Java большинство ошибок времени выполнения сообщаются как исключения, и именно поэтому программа может их перехватить. Но в таких языках, как C, ошибки времени выполнения есть, а исключений нет вовсе. В Java RuntimeException к тому же название одного конкретного семейства исключений, непроверяемых, например NullPointerException.
Может ли компилятор поймать ошибки времени выполнения?
Только некоторые. Компилятор или проверка типов вроде mypy может доказать, что определённые ошибки невозможны, например сложение текста с числом. Но он не может знать значения, которые появляются во время работы программы, например число, введённое пользователем, которое оказалось нулём. Такие ошибки находятся только при запуске кода или обрабатываются проверкой входных данных.
Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ