4

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

4

1 回答 1

4

当然,CL 有一个非常好的条件系统。一个简单的选择是包装对do-http-requestin的调用,如果在包装的代码中发出错误条件信号ignore-errors,它将返回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 调用该重新启动来重试来处理您的错误情况。我只是为了完整起见而提到这一点——这对你的用例来说太过分了,但是能够轻松地恢复(可能是昂贵的)计算可能是一个相当方便的功能。

于 2012-07-31T04:07:07.477 回答