AllegroServe异常处理

时间:2012-07-30 22:09:58

标签: exception-handling lisp common-lisp allegro-cl

如果将参数作为参数传递给函数do-http-request无效的主机,我怎么能避免出错? 有没有什么方法可以像Java的异常处理机制那样捕获错误?

1 个答案:

答案 0 :(得分:4)

当然,CL有一个非常好的条件系统。一个简单的选择是将调用包装在ignore-errorsdo-http-request,如果在包装代码中发出错误信号,则返回nil(条件为第二个值)。然后,您可以检查nil

如果你想要更像Java中的异常处理,只需使用handler-case并添加一个适当的错误子句(我没有安装AllegroServe,但我想你得到一个socket-error来提供一个错误的网址 - 如果我误读,只需更改该部分:

(handler-case
    (do-http-request …)
  (socket-error ()
    …))

如果您需要finally之类的功能,请使用unwind-protect

(unwind-protect
     (handler-case
         (do-http-request …)
       (socket-error (condition) ; bind the signalled condition
         …)                      ; code to run when a socket-error was signalled
       (:no-error (value)        ; bind the returned value
         …))                     ; code to run when no condition was signalled
  …)                             ; cleanup code (finally)

你甚至可以获得更多的幻想,例如使用handler-bind通过在堆栈的某处调用重启来向上处理条件堆栈,而不需要展开它。例如,如果do-http-request提供重新启动以再次尝试使用其他URL,则可以通过使用新URL重新调用重新启动来处理错误情况。我只是为了完整性而提到这一点 - 这对你的用例来说太过分了,但是能够轻松恢复(可能很昂贵)的计算可能是一个相当方便的功能。