异常处理 – AllegroServe异常处理

如何将函数do-http-request作为参数传递给无效主机时,如何避免出错.
有没有什么方法可以像Java的异常处理机制那样捕获错误?
最佳答案
当然,CL有一个非常好的条件系统.一个简单的选择是在ignore-errors中包含对do-http-request的调用,如果在包装代码中发出错误条件,则返回nil(并将条件作为第二个值).然后你可以检查nil.

如果你想要更像Java中的异常处理,只需使用handler-case并添加一个适当的错误子句(我没有安装AllegroServe,但我认为你提供错误的URL会出现套接字错误 – 如果我改变了那个部分误解):

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

如果您需要最终类似的功能,请使用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重新调用重新启动来处理错误情况.我只是为了完整性而提到这一点 – 这对你的用例来说太过分了,但是能够轻松恢复(可能很昂贵)的计算可能是一个相当方便的功能.

转载注明原文:异常处理 – AllegroServe异常处理 - 代码日志