Песочница

Детерминированная обработка ошибок

Используйте with-exception-handler для процедурной обработки и guard для условного сопоставления перехватываемых объектов ошибок.

Проверьте запуском

LISPEX
(guard (e ((error-object? e) (error-object-message e))) (error "bad input"))

Наблюдаемый результат

OUTPUT
"bad input"

Разберите приём

  1. Возбудите гостевую ошибку. (error "bad input") строит перехватываемый объект со стабильным сообщением.
  2. Сопоставьте структуру. guard проверяет error-object?, а не разбирает напечатанный текст.
  3. Верните значение восстановления. Выбранная ветвь извлекает сообщение, и вся форма даёт "bad input".

Как рассуждать

  • raise-continuable возвращает результат обработчика в место возбуждения. Возбуждение через raise продолжить нельзя, поэтому оно не может вернуться нормально.
  • Используйте документированные предикаты и функции доступа к объекту ошибки, а не разбор отображённого текста диагностики.
  • Если ни одна ветвь guard не совпала, исходная ошибка поднимается заново без изменения.

Проверьте себя

Что произойдёт, если ни одна ветвь guard не совпадёт с объектом ошибки?

Ответ

Исходная ошибка будет поднята снова без изменений. Отсутствие совпадения не превращается в общее успешное значение.

Частая ошибка

ResourceLimit не перехватывается, а падение хоста не превращается в удобную гостевую ошибку.

Куда дальше

Этапы и коды описаны в диагностике, а руководство по записям решения показывает, что именно отклоняет один записанный запуск и что остаётся приложению.

Диагностика · Записи решения