Как предотвратить запуск sldb при определенных ошибках?
При обслуживании больших файлов из Clack/Hunchentoot с подключенным Slime я иногда вижу сообщения об ошибках, такие как SB-IMPL::SIMPLE-STREAM-PERROR "Не удалось записать в ~s"... Это вызвано тем, что браузер преждевременно разрывает соединения (что совершенно нормально). Проблема в том, что каждый раз, когда это происходит, появляется SLDB. Что раздражает.
Есть ли способ, которым я могу запретить определенные ошибки в SLDB, такие как выше? Я все еще хотел бы видеть их в журнале ошибок, но определенно не в SLDB.
2 ответа
ОБНОВЛЕНО
Поскольку ваша система использует Hunchentoot, вы можете установить глобальную переменную HUNCHENTOOT:*CATCH-ERRORS-P*
в T
, Это должно гарантировать, что все условия, возникающие в коде, управляемом Hunchentoot, отслеживаются самим Hanchentoot и не передаются отладчику.
Чтобы отключить отладчик в любой реализации Common Lisp (как внутри REPL оболочки, так и в REPL Slime внутри Emacs), вы можете использовать предопределенную глобальную переменную *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 из-за того, как эти два пакета взаимодействуют по отношению к стратегиям отладки.
В этом случае можно принять решение, найденное Майком Ивановым, которое переопределяет swank-debugger-hook
Функция перед запуском Swank:
(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)
Вы можете подкласс 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)))
Убедитесь, что вы действительно запускаете сервер, используя этот акцептор, чтобы он мог использоваться.