當用Clause/Hunchentoot連接Slime提供的大文件時,我有時會看到類似SB-IMPL :: SIMPLE-STREAM-PERROR的錯誤消息「無法寫入〜s」......這些都是由於瀏覽器過早丟失連接(這是完全正常的)。問題在於每次發生時都會彈出SLDB。這很煩人。如何防止粘液在某些錯誤上啓動sldb?
有沒有一種方法可以抑制SLDB中的某些錯誤,比如上述?我仍然希望在錯誤日誌中看到它們,但絕對不在SLDB中。
當用Clause/Hunchentoot連接Slime提供的大文件時,我有時會看到類似SB-IMPL :: SIMPLE-STREAM-PERROR的錯誤消息「無法寫入〜s」......這些都是由於瀏覽器過早丟失連接(這是完全正常的)。問題在於每次發生時都會彈出SLDB。這很煩人。如何防止粘液在某些錯誤上啓動sldb?
有沒有一種方法可以抑制SLDB中的某些錯誤,比如上述?我仍然希望在錯誤日誌中看到它們,但絕對不在SLDB中。
修訂
由於系統使用Hunchentoot,你可以在全局變量HUNCHENTOOT:*CATCH-ERRORS-P*
設置爲T
。這應該保證由Hanchentoot管理的代碼中產生的所有條件都由Hanchentoot自己捕獲,而不是傳遞給調試器。
在任何Common Lisp實現禁用調試器(包括外殼REPL以及煤泥REPL在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時煤泥,由於這兩個包相對於調試戰略互動的方式第二種方法卻無法正常工作。
在這種情況下,人們可以採用solution found by Mike Ivanov,重新定義了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)
您可以爲您的接受者繼承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)))
確保你真正開始服務器使用這個接受器以便使用它。
謝謝。這絕對是一個好方法,但仍然是:有沒有一種方法可以在實際解決問題時防止SLDB啓動?說,如果沒有可用的來源,沒有辦法子類/重寫或一些其他約束。只是好奇。 –
您可以調用該函數從某處啓動hunchentoot,如果圍繞該調用安裝了一個處理程序,它應該(我相信)會處理髮出錯誤的信號,並且只有未處理的錯誤纔會觸發調試程序。 – Vatine
@Vatine - nope,發生在另一個線程=>在啓動調用周圍的處理程序之外。 –
感謝,但它並沒有真正使用線程: CL-USER> *調試掛機* =># 然後: CL-USER>(波爾多線程:使-thread(lambda()(princ * debugger-hook *)))=># –
這可能是,通過使用粘液,swank將覆蓋\ * debugger-hook \ *。我會看看史萊姆的文檔。 – Renzo
我認爲可能有某種線程啓動掛鉤,Slime用於在新線程中設置調試器掛鉤... –