0

私は現在、SBCL が提供するsb-thread APIで遊んでいます。開始されたスレッド内でエラーがスローされた場合にどうなるか、また、そのプロセスのみが影響を受け (そして停止し)、他のプロセスが影響を受けないようにする方法を考えています。メインスレッドがエラーをスローしなくても、デバッガーに入ります。

* (handler-case 
    (sb-thread:join-thread (sb-thread:make-thread #'(lambda()
                              (error 'simple-error))))
  (sb-thread:join-thread-error (err)
    (sb-thread:thread-error-thread err)
    (FORMAT t "allemeineentchen~%")))

(A SIMPLE-ERROR was caught when trying to print *DEBUG-CONDITION* when entering
the debugger. Printing was aborted and the SIMPLE-ERROR was stored in
SB-DEBUG::*NESTED-DEBUG-CONDITION*.)
;after this sbcl just yields until str-c enters the debugger

私の提案は、各スレッド関数本体を an で始まるようにすること(handler-case (body) (error (err) err)ですが、これは非常に非標準/不正行為のようであり、関数本体が私によって作成されたスレッドでのみ機能します。デバッガー。

このトピックに関するガイドライン/(非公式)標準はありますか?

4

1 に答える 1

2

何がシグナルされ、何が処理されているか (およびどこで) を明確にする必要があります。まず、処理しようとしているエラー条件は何ですか? スレッドで 'simple-error を使用して #'error を呼び出すと、sbcl が通知したエラーを出力できないため、問題になりますが、それ以外の場合は正常に機能します。私がこれを行う場合:

(handler-case 
         (sb-thread:join-thread 
          (sb-thread:make-thread #'(lambda()
                                     (error "simple error"))))
       (simple-error (c)
         c)
       (sb-thread:join-thread-error (c)
         (sb-thread:thread-error-thread c)))

sbcl は未処理の単純なエラーに対してデバッガに正しく入りますが、デバッガからのアボート再起動を使用した後に通知される join-thread-error は処理されます。それがあなたが尋ねていたことだと思います:

simple error
[Condition of type SIMPLE-ERROR]

Restarts:
 0: [ABORT] Abort thread (#<THREAD RUNNING {DABCAD1}>) 0 ==> #<SB-THREAD:THREAD ABORTED {DABCAD1}>

編集:シムのコメントを読んだ後、これを追加しています:

スレッド内のエラーを無視したい場合は、次のようにします。

(sb-thread:join-thread 
          (sb-thread:make-thread #'(lambda() (ignore-errors
                                               (error "simple error")))))
于 2013-08-12T14:46:43.517 に答える