当连接Slime的Clack / Hunchentoot提供大文件时,我有时会看到像SB-IMPL :: SIMPLE-STREAM-PERROR这样的错误消息“无法写入~s”......这些是由浏览器过早造成的丢弃连接(完全没问题)。问题是,每次发生时,SLDB都会弹出。这很烦人。
有没有办法可以抑制SLDB中的某些错误,如上所述?我仍然希望在错误日志中看到它们,但绝对不在SLDB中。
答案 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