Песочница

Как читать ошибки и предупреждения

Найдите место исправления по коду и позиции в исходнике, затем определите, доступен ли обработчик на этом этапе.

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

Команда ниже использует нативную установку lispex из раздела «Первая программа».

Прочитайте диагностику выполнения

Сохраните этот полный пример в файле pair.lspx.

LISPEX
(car 1)
BASH
lispex run pair.lspx

Команда оставляет стандартный вывод пустым, пишет диагностику в поток ошибок и завершается с кодом 1. Выходной файл не создаётся.

E310 pair.lspx:1:1 car: expected a pair, got 1
ЧастьЧто она сообщает
E310Операция ожидала пару.
pair.lspx:1:1Проверьте строку 1, столбец 1 этого файла.
car: expected a pair, got 1car получила число 1. Проверьте аргумент.

Чтобы вернуть первый элемент, передайте пару, например '(1 2), вместо 1. Полное выражение (car '(1 2)) возвращает 1.

Чтобы обработать ошибку, вставьте этот полный пример в песочницу.

LISPEX
(guard (e (else (error-object-message e))) (car 1))

Результат

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

Здесь guard перехватывает объект ошибки и возвращает его сообщение строкой. Выражение завершается успешно.

Найдите этап и следующее действие

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

Этап и кодыЧто проверитьДоступен ли обработчик?
Чтение · E100, E140, E150Токены, скобки, точечные списки, экранирование в строках и символахНет. Исправьте исходник.
Нормализация · E110, E130Зарезервированные имена и обязательные части формНет. Исправьте связывание или форму.
Чтение или нормализация · E120Запрещённое расширение или формуНет. Используйте синтаксис, поддерживаемый профилем языка.
Выполнение · E300–E340Указанную операцию и переданные ей значенияОшибки выполнения можно обработать. Исключение для E314 описано ниже.
Предупреждения выполнения · W330, W331Устаревающее имя процедурыВыполнение продолжается. Используйте рекомендованную замену.
Предел ресурсов · ResourceLimitОбъём работы программы и профиль ресурсовНет. Исчерпание ресурсов завершает запуск отдельно от перехватываемых ошибок E3xx.

Для E314 проверьте этап. Литерал 1e999 вызывает ошибку при чтении даже внутри guard. Переполнение в (* 1e308 1e308) возникает во время выполнения и перехватывается.

Диагностика выполнения использует фиксированные шаблоны сообщений и единообразную запись значений. Обычно она указывает на охватывающий вызов. E300 указывает на само несвязанное имя: в (+ 1 missing) это missing в столбце 6.

Первая неперехваченная ошибка останавливает выполнение. Лиспекс сообщает диагностику исходника без трассировки стека среды. Аварийное завершение вызывающего приложения требует исследования сбоя приложения.

Читайте предупреждения отдельно от результата

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

LISPEX
(% 7 3)
BASH
lispex run warning.lspx

Стандартный вывод содержит результат.

1

Поток ошибок содержит предупреждение.

W330 warning.lspx:1:1 `%` is a deprecated alias of `modulo` — prefer `modulo`

Код завершения равен 0, выходной файл не создаётся. Замените % на modulo, чтобы сохранить результат и убрать это предупреждение.

Устаревающее имяИмя для нового кодаВыполняемая операция
%modulomodulo
list-firstfirstcar
list-restrestcdr

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

Сохраняйте предупреждения в порядке возникновения, отдельно от стандартного вывода и диагностики ошибки. Если операция завершится ошибкой, предупреждение останется записанным. Например, (list-first 1) выдаёт W331, затем E310.

Поиск кода · Обработка ошибок через guard