在连接了Slime的情况下从Clack / Hunchentoot提供大文件时,有时会看到诸如SB-IMPL :: SIMPLE-STREAM-PERROR之类的错误消息“无法写入〜s” ...这是由浏览器过早断开连接引起的(完全可以)。问题在于,每次发生SLDB都会弹出。真烦人。

有什么办法可以抑制上述SLDB中的某些错误?我仍然希望在错误日志中看到它们,但绝对不能在SLDB中看到它们。

最佳答案

更新

由于您的系统使用Hunchentoot,因此可以将全局变量HUNCHENTOOT:*CATCH-ERRORS-P*设置为T。这应该确保由Hunchentoot管理的代码中出现的所有条件都由Hanchentoot本身捕获,而不传递给调试器。

要在任何Common Lisp实现中禁用调试器(在Shell REPL内以及Emacs内的Slime REPL内),您可以使用预定义的全局变量*debugger-hook*,方法是为其分配两个参数函数。该函数在调用时将接收条件和* debugger-hook *的当前值,并且可以处理该条件或正常返回,在这种情况下,将调用调试器。例如,您可以简单地打印条件:

* (defun my-debug(condition hook)
    (declare (ignore hook))
    (print condition)
    (abort))

DEBUG-IGNORE
* (setf *debugger-hook* #'my-debug)

#<FUNCTION MY-DEBUG>


但是,将Hunchentoot与Slime一起使用时,第二种方法不起作用,原因是这两个软件包在调试策略方面相互影响。

在这种情况下,可以采用solution found by Mike Ivanov,在启动Swank之前重新定义swank-debugger-hook函数:

(in-package swank)

(setq swank-debugger-hook-orig #'swank-debugger-hook)

(defun swank-debugger-hook (condition hook)
  (etypecase condition
    (sb-int:simple-stream-error
      (progn
        (princ "*** Stream error" *error-output*)
        (abort)))
    (t (funcall swank-debugger-hook-orig condition hook))))

(in-package cl-user)

(swank:create-server :port 4008 :dont-close t)

09-25 22:15