Песочница

Как читать и обрабатывать ошибки

Найдите место исправления по диагностике и обработайте ошибку выполнения с помощью guard.

По диагностике можно найти код, который нужно исправить. Если ошибка возникла во время выполнения, используйте guard, чтобы выбрать результат, который вернёт программа.

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

При E100 сначала исправьте исходник

Сохраните этот полный пример в файле syntax.lspx. В нём пропущена закрывающая скобка.

LISPEX
(+ 1 2

Запустите файл.

BASH
lispex run syntax.lspx

Команда выводит диагностику в стандартный поток ошибок и завершается с кодом 1. Стандартный вывод пуст.

E100 syntax.lspx:1:1 unterminated list (missing `)`)

syntax.lspx:1:1 указывает на строку 1, столбец 1, где начинается незакрытый список. Добавьте закрывающую скобку.

LISPEX
(+ 1 2)

Повторите ту же команду.

BASH
lispex run syntax.lspx
3

Теперь команда пишет 3 в стандартный вывод и завершается с кодом 0. Ни один из двух запусков не создаёт выходной файл.

E100 возникает при чтении исходника, до выполнения guard. Сначала исправьте исходный текст.

Обработайте ошибку выполнения

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

LISPEX
(guard (e ((error-object? e) (error-object-message e))) (error "bad input"))
BASH
lispex run user-error.lspx
"bad input"

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

  1. error создаёт объект ошибки с сообщением "bad input".
  2. guard перехватывает объект и связывает его с e.
  3. error-object? проверяет значение. Подходящая ветвь возвращает сообщение.

Всё выражение guard возвращает строку. Выполнение не возобновляется с вызова error. Изучайте объект через error-object?, error-object-message и error-object-irritants, а не разбирайте напечатанную диагностику.

Решите, что исправить и что обработать

Что произошлоЧто делать
Чтение исходника или проверка формы завершились ошибкой до выполненияИсправьте указанное место. Обработчик ещё не запущен.
Возникла перехватываемая ошибка выполненияИсправьте операцию или верните подходящий результат через guard.
Ни одна ветвь guard не подошла и нет elseОшибка с исходным объектом передаётся внешнему обработчику.
Достигнут предел ресурсовУменьшите объём работы или пересмотрите профиль ресурсов. guard не перехватывает ResourceLimit.
Вызывающее приложение аварийно завершилосьИсследуйте сбой приложения. Он не преобразуется в объект ошибки Лиспекса.

Продолжите выполнение после вызова обработчика

Для обработчика в виде процедуры используйте with-exception-handler. Вызов raise-continuable получает возвращённое обработчиком значение и позволяет продолжить вычисление.

Вставьте этот полный пример в песочницу.

LISPEX
(with-exception-handler
  (lambda (e) 10)
  (lambda () (+ 1 (raise-continuable "retry"))))

Результат

ВЫВОД
11

Обработчик возвращает 10, затем + прибавляет 1. Если заменить вызов на raise, обычный возврат из обработчика вызовет E332. Чтобы выйти из ошибочного выражения и вернуть результат из окружающей формы, используйте guard.

Этапы диагностики · Поиск кода · Записи решения