如果将参数作为参数传递给函数do-http-request无效的主机,我怎么能避免出错? 有没有什么方法可以像Java的异常处理机制那样捕获错误?
答案 0 :(得分:4)
当然,CL有一个非常好的条件系统。一个简单的选择是将调用包装在ignore-errors
中do-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重新调用重新启动来处理错误情况。我只是为了完整性而提到这一点 - 这对你的用例来说太过分了,但是能够轻松恢复(可能很昂贵)的计算可能是一个相当方便的功能。