在Common Lisp中安装条件处理程序

Pau*_*han 4 lisp exception common-lisp conditional-statements

由于Drakma + CLISP中的错误,CLISP上的HTTP库Drakma生成错误USOCKET:UNSUPPORTED.但是,事实证明CONTINUE重启似乎工作正常.因此,我花了一些时间与CLtL和其他引用尝试确定如何编写重启处理程序.

(defun http-request (url param)
  (handler-bind ((USOCKET:UNSUPPORTED
          #'(lambda (x)
              (invoke-restart 'continue)))))

  (drakma:http-request url
               :method :post
               :parameters
               param))
Run Code Online (Sandbox Code Playgroud)

根据我的最佳理解,上面的代码应该捕获错误USOCKET:UNSUPPORTED.它没有; 它似乎忽略了错误绑定器.

我该如何解决?

dan*_*lei 5

好吧,我不确定我是否可以在这里帮助你,但是:你的parens完全搞砸了.试试这样:

(defun http-request (url param)
  (handler-bind ((usocket:unsupported #'continue))
    (drakma:http-request url :method :post :parameters param)))
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,请尝试检查您是否真正处理了正确的条件,以及您期望的重启是否真的可用:

(defun http-request (url param)
  (handler-bind ((condition (lambda (c)
                              (print c)
                              (print (compute-restarts)))))
    (drakma:http-request url :method :post :parameters param)))
Run Code Online (Sandbox Code Playgroud)

或者,你可以看看 IGNORE-ERRORS