AllegroServe异常处理
答
当然,CL有一个非常好的条件系统。一个简单的选择是将呼叫打包到ignore-errors
中的do-http-request
,如果在包装代码中发信号通知错误条件,则返回nil
(以及条件作为第二值)。之后您可以检查nil
。
如果你想要更类似于Java中的异常处理,只需使用handler-case
并添加一个适当的错误子句(我没有安装AllegroServe,但我想你得到一个socket-error
提供了一个错误的URL - 只是改变那部分如果我误解):
(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重新启动该重新启动来处理错误情况。我只是为了完整而提到这一点 - 这对您的用例来说会是过分的,但能够轻松恢复(可能很昂贵)的计算可能是一个相当方便的功能。