← Архив: Common Lisp

Lisp conditions

Author: · 08.02.2010 21:58
· original author: Ivanushka
Здравствуйте. Помогите пожалуйста простым примером обработки conditions. В Drakma есть тип ошибок drakma-error. Задача при возникновении любой такой (конкретно при вызове метода http-request) ошибки выполнить определенный код. Извените за формулировку, но что и где написать?
· original author: dmitry_vk
Зависит от того, как вы хотите обрабатывать этот кондишен.
Есть два варианта: 1) привычный многим try-catch и 2) обработка с возможностью рестарта.
Первый вариант:
(handler-case
    (drakma:http-request "asd")
  (drakma:drakma-error (e) (format t "Error: ~A~%" e))
)

=>
Error: Don't know how to handle scheme NIL.
NIL
handler-case работает следующим образом: Выполнеяется первая форма в handler-case (если форм много, то их надо обрамить в progn). При возникновкении ошибки во время выполнения форм произведется раскрутка стека (вместе с вызовом соответствующего кода из unwind-protect) и будет выполнен код, который указан в качестве обработчика для handler-case, который получает ссылку экземпляр ошибки. Т.е., полный аналог try/catch из C++/Java/C#.
Второй случай чуть более сложный; он описан, например, в Practical Common Lisp (http://lisper.ru/pcl/beyond-exception-handling-conditions-and-restarts)
· original author: Ivanushka
Я правильно понял, в первом варианте мне нужно свою вызывающую http-request функцию обернуть в (handler-case ...)? Если так, то пожалуй этот вариант меня устроит. Спасибо.
· original author: dmitry_vk
Да, именно так. ошибка может произойти где угодно внутри handler-case, и обработчик ее обработает.