在连接了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)