Язык Lisp настроен для удобства создания программ из данных. Чтобы проверить, что созданная программа работала, иногда единственным решением служит запуск программы. При возникновении ошибки в программе поднимается системный флажок (исключение). Если после вычисления задачи флажок исключение поднят, то можно запускать другие задачи для восстановления ошибки.
Функция try запускает задачу. При возникновении исключения проверяется код ошибки. Проверка осуществляется командой eq, то-есть идентичностью.
(nil try (nil eval task) out-of-memory (cout writeln "Out of memory") nil (cout writeln "Task " task " is wrong"))
Ошибка может быть символом, списком или другой, заданной командой throw. Последним кодом ошибки можно поставить nil, для перехвата всех исключений. Узнать какая была ошибка можно с помощью функции exception.
(nil try (nil eval task) nil (cout writeln "Exception is " (nil exception)))
Примером использовании может служить функция добавления чисел в вектор. При получении ошибки функция не знает, что делать и отправляет сигнал функции, вызвавшей её.
('vector defmethod add-number (x n) (nil if (nil numberp x) (nil if (nil numberp n) (nil try (this push x n) nil (nil throw 'out-of-memory)) (nil throw 'syntax)) (nil throw 'syntax))) (nil setq v ('vector newobject)) (nil try (v add-number "1") nil (cout writeln "error: " (nil exception))) (nil try (v add-number 1 1e10) nil (cout writeln "error: " (nil exception)))
Результатом будет выводы ошибок syntax и out-of-memory.
Самым важным моментом отладки программ является вывод истории вычислений, в момент когда исключение возникло. Историю можно получить с помощью функции (nil exception-history). История задаётся как список (… команда …).