Песочница

Коды ошибок и предупреждений

Найдите диагностический код, определите место проверки и возможность обработки ошибки.

Найдите полученный код, чтобы понять, что проверить дальше. Перед выбором обработчика исключений уточните этап возникновения ошибки.

Начните с кода

Это полное выражение вызывает ошибку во время выполнения.

LISPEX
(car 1)

Код и сообщение

ВЫВОД
E310 · car: expected a pair, got 1

Строка E310 ниже предлагает проверить аргумент car. Если передать пару, как в (car '(1 2)), результатом будет 1. Полный файл, команда и позиция ошибки разобраны в руководстве по диагностике.

Исправьте исходник до выполнения

На этих этапах обработчики ещё не запущены. Исправьте исходник и запустите его снова.

КодЭтапЧто проверить
E100ЧтениеНеверный токен или непарный разделитель, например пропущенную ) в (+ 1 2.
E110НормализацияСвязывание зарезервированного слова, например if. Выберите другое имя.
E120Чтение или нормализацияЗапрещённое расширение или форму, например #; или define-syntax.
E130НормализацияОбязательные части формы, например все три выражения в if.
E140ЧтениеСтруктуру точечного списка: положение точки и значение после неё.
E150ЧтениеНеверное экранирование в строке или символьный литерал.
E314ЧтениеЛитерал неточного числа, которое не является конечным, например 1e999.

При чтении текст преобразуется в значения и формы. Нормализация проверяет структуру форм и преобразует сокращения в основные формы.

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

Эти ошибки возникают, когда выполнение доходит до проблемной операции. Их можно обработать через guard: выбранная ветвь возвращает результат всего выражения guard.

КодПричинаЧто проверить
E300Чтение несвязанного имениИмя в указанной позиции исходника и его определение.
E301Вызов значения, которое не является процедуройЗначение на месте процедуры в вызове.
E302Неверное число аргументовПараметры процедуры и число переданных аргументов.
E303set! для несвязанного имениБыло ли имя связано до присваивания.
E310Операция ожидала пару или подходящий списокАргумент car, cdr или указанной процедуры для списков.
E311Индекс вне диапазонаИндекс и размер значения, к которому обращается программа.
E312Встроенная процедура получила неверный типТипы, которые принимает указанная процедура.
E313Деление на нольДелитель.
E314Неточный результат не является конечнымАрифметическую операцию и величину операндов.
E320Число возвращённых значений не подходит для этой позицииОжидает ли принимающее выражение одно значение или допускает несколько.
E321Чтение связывания letrec до инициализацииСсылки на имена при вычислении начальных значений.
E340Продолжение выхода больше не активноБыло ли оно уже использовано или завершился ли создавший его вызов.

E314 на этапе чтения не перехватывается. E314 от арифметической операции во время выполнения можно перехватить.

Продолжение выхода — это процедура, созданная call/cc для досрочного возврата из своего вызова. Её можно использовать только один раз, пока этот вызов активен.

Обработайте объект от raise или ошибку обработчика

КодПричинаКак обработать
E330(error message …) вызывает ошибку с объектомguard получает объект. Прочитайте сообщение и приложенные к ошибке значения.
E331Переданный с ошибкой объект дошёл до верхнего уровня без обработкиПерехватите его через guard или обработчик. raise передаёт любое значение, поэтому перед чтением полей проверьте error-object?.
E332Обработчик нормально вернулся после ошибки, которая не допускает продолженияВнешний обработчик может перехватить эту новую ошибку. Для выхода из ошибочного выражения используйте guard. Для продолжения с возвращённым значением используйте raise-continuable.

Если ни одна ветвь guard не подошла и нет else, ошибка с исходным объектом передаётся дальше. raise-continuable возвращает результат обработчика в вызов, который передал ему условие. Оба способа показаны в руководстве по обработке ошибок.

Замените устаревающие имена

Предупреждения сохраняют порядок возникновения. Встроенная устаревающая процедура предупреждает один раз на место вызова, даже если затем операция завершится ошибкой. Связывание, перекрывающее это имя, не вызывает предупреждения об устаревшем имени.

КодВызов с предупреждениемИмя для нового кода
W330%modulo
W331list-first или list-restfirst или rest соответственно

Отреагируйте на предел ресурсов

ResourceLimit обозначает ресурсный исход отдельно от перехватываемых ошибок E3xx. Нехвостовой вызов оставляет работу после возврата вызванной процедуры. Когда глубина таких вызовов достигает предела, нативная команда сообщает recursion-limit и завершается с кодом 2.

Уменьшите объём работы или пересмотрите объявленный профиль ресурсов. Обработчик исключений не может продолжить запуск, остановленный пределом ресурсов.

Позиции диагностики и потоки вывода · Обработка ошибок