Прочитайте код диагностики и позицию в исходнике, чтобы понять, что исправить. Этап возникновения покажет, произошла ли ошибка до выполнения или может попасть в обработчик.
Команда ниже использует нативную установку lispex из раздела «Первая программа».
Прочитайте диагностику выполнения
Сохраните этот полный пример в файле pair.lspx.
(car 1)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 1 | car получила число 1. Проверьте аргумент. |
Чтобы вернуть первый элемент, передайте пару, например '(1 2), вместо 1. Полное выражение (car '(1 2)) возвращает 1.
Чтобы обработать ошибку, вставьте этот полный пример в песочницу.
(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.
(% 7 3)lispex run warning.lspxСтандартный вывод содержит результат.
1Поток ошибок содержит предупреждение.
W330 warning.lspx:1:1 `%` is a deprecated alias of `modulo` — prefer `modulo`Код завершения равен 0, выходной файл не создаётся. Замените % на modulo, чтобы сохранить результат и убрать это предупреждение.
| Устаревающее имя | Имя для нового кода | Выполняемая операция |
|---|---|---|
% | modulo | modulo |
list-first | first | car |
list-rest | rest | cdr |
Вызов встроенной устаревающей процедуры выдаёт предупреждение до операции, один раз на место вызова в исходнике. Если программа связывает то же имя с другой процедурой, предупреждения об устаревшем имени не будет.
Сохраняйте предупреждения в порядке возникновения, отдельно от стандартного вывода и диагностики ошибки. Если операция завершится ошибкой, предупреждение останется записанным. Например, (list-first 1) выдаёт W331, затем E310.