По диагностике можно найти код, который нужно исправить. Если ошибка возникла во время выполнения, используйте guard, чтобы выбрать результат, который вернёт программа.
Примеры с файлами используют нативную команду lispex из раздела «Первая программа».
При E100 сначала исправьте исходник
Сохраните этот полный пример в файле syntax.lspx. В нём пропущена закрывающая скобка.
(+ 1 2Запустите файл.
lispex run syntax.lspxКоманда выводит диагностику в стандартный поток ошибок и завершается с кодом 1. Стандартный вывод пуст.
E100 syntax.lspx:1:1 unterminated list (missing `)`)syntax.lspx:1:1 указывает на строку 1, столбец 1, где начинается незакрытый список. Добавьте закрывающую скобку.
(+ 1 2)Повторите ту же команду.
lispex run syntax.lspx3Теперь команда пишет 3 в стандартный вывод и завершается с кодом 0. Ни один из двух запусков не создаёт выходной файл.
E100 возникает при чтении исходника, до выполнения guard. Сначала исправьте исходный текст.
Обработайте ошибку выполнения
Сохраните этот полный пример в файле user-error.lspx.
(guard (e ((error-object? e) (error-object-message e))) (error "bad input"))lispex run user-error.lspx"bad input"Команда завершается с кодом 0. Поток ошибок пуст, выходной файл не создаётся.
errorсоздаёт объект ошибки с сообщением"bad input".guardперехватывает объект и связывает его сe.error-object?проверяет значение. Подходящая ветвь возвращает сообщение.
Всё выражение guard возвращает строку. Выполнение не возобновляется с вызова error. Изучайте объект через error-object?, error-object-message и error-object-irritants, а не разбирайте напечатанную диагностику.
Решите, что исправить и что обработать
| Что произошло | Что делать |
|---|---|
| Чтение исходника или проверка формы завершились ошибкой до выполнения | Исправьте указанное место. Обработчик ещё не запущен. |
| Возникла перехватываемая ошибка выполнения | Исправьте операцию или верните подходящий результат через guard. |
Ни одна ветвь guard не подошла и нет else | Ошибка с исходным объектом передаётся внешнему обработчику. |
| Достигнут предел ресурсов | Уменьшите объём работы или пересмотрите профиль ресурсов. guard не перехватывает ResourceLimit. |
| Вызывающее приложение аварийно завершилось | Исследуйте сбой приложения. Он не преобразуется в объект ошибки Лиспекса. |
Продолжите выполнение после вызова обработчика
Для обработчика в виде процедуры используйте with-exception-handler. Вызов raise-continuable получает возвращённое обработчиком значение и позволяет продолжить вычисление.
Вставьте этот полный пример в песочницу.
(with-exception-handler
(lambda (e) 10)
(lambda () (+ 1 (raise-continuable "retry"))))Результат
11Обработчик возвращает 10, затем + прибавляет 1. Если заменить вызов на raise, обычный возврат из обработчика вызовет E332. Чтобы выйти из ошибочного выражения и вернуть результат из окружающей формы, используйте guard.