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 为未处理的简单错误正确输入了调试器,但是在我使用调试器的中止重启后发出的连接线程错误确实得到了处理,我认为这就是您要问的问题:

simple error
[Condition of type SIMPLE-ERROR]

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

编辑:我在阅读 Sim 的评论后添加了这个:

如果您只想忽略线程中的任何错误,请执行以下操作:

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