2012-07-30 123 views

回答

4

当然,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重新启动该重新启动来处理错误情况。我只是为了完整而提到这一点 - 这对您的用例来说会是过分的,但能够轻松恢复(可能很昂贵)的计算可能是一个相当方便的功能。