Как предотвратить запуск 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)))

Убедитесь, что вы действительно запускаете сервер, используя этот акцептор, чтобы он мог использоваться.

Другие вопросы по тегам