如何防止粘液在某些错误上启动sldb?

时间:2015-12-30 05:34:21

标签: emacs common-lisp sbcl slime hunchentoot

当连接Slime的Clack / Hunchentoot提供大文件时,我有时会看到像SB-IMPL :: SIMPLE-STREAM-PERROR这样的错误消息“无法写入~s”......这些是由浏览器过早造成的丢弃连接(完全没问题)。问题是,每次发生时,SLDB都会弹出。这很烦人。

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

2 个答案:

答案 0 :(得分:5)

您可以为接受者创建PROCESS-CONNECTION子类,并针对此错误进行自己的错误处理。

让我们从定义自定义接受器开始:

(defclass no-error-acceptor (hunchentoot:acceptor)
  ())

然后我们可以在PROCESS-CONNECTION周围创建一个包装器,禁止为此特定错误打印消息:

(defmethod hunchentoot:process-connection ((acceptor no-error-acceptor) (socket t))
  (handler-case
      (call-next-method)
    (sb-impl::simple-stream-perror (condition)
      ;; Perhaps log the error here?
      nil)))

确保使用此接受器实际启动服务器,以便使用它。

答案 1 :(得分:2)

<强>已更新

由于您的系统使用Hunchentoot,您可以将全局变量// newmytable +----+--------------------------+---------------+-----------------+ | id | Email | IP | cookies | +----+--------------------------+---------------+-----------------+ | 1 | jack.123@gmail.com | 172.95.65.7 | 5c6ffbdd40d95 | | 4 | peter_1998@gmail.com | 172.95.65.7 | 5c6ffbdd40d95 | +----+--------------------------+---------------+-----------------+ 设置为HUNCHENTOOT:*CATCH-ERRORS-P*。这应该保证Hunchentoot管理的代码中出现的所有条件都被Hanchentoot本身捕获,而不是传递给调试器。

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

T

然而,当将Hunchentoot与Slime一起使用时,第二种方法无法工作,因为两个包与调试策略相互作用的方式。

在这种情况下,可以采用solution found by Mike Ivanov,在启动Swank之前重新定义* (defun my-debug(condition hook) (declare (ignore hook)) (print condition) (abort)) DEBUG-IGNORE * (setf *debugger-hook* #'my-debug) #<FUNCTION MY-DEBUG> 函数:

swank-debugger-hook