跟踪异常

Trace an exception

假设子线程中的这个简单循环每秒执行 step,同时您可以通过 REPL 进行交互(检查 state 或更改 step):

(import (srfi 18) (chicken repl))

(define mutex (make-mutex))
(define (with-mutex-locked mutex thunk) (dynamic-wind
    (lambda () (mutex-lock! mutex))
    (lambda () (thunk))
    (lambda () (mutex-unlock! mutex))))

(set! state 0)
(define (step) (set! state (+ state 1)))

(define (loop)
    (with-mutex-locked mutex step)
    (sleep 1)
    (loop))

(thread-start! loop)
(repl (lambda (x) (with-mutex-locked mutex (lambda () (eval x)))))
(exit)

但是,当将 step 更改为错误的内容时,线程崩溃并打印跟踪:

(define (step) (car `()))
Warning (#<thread: thread26>): in thread: (car) bad argument type: ()

    Call history:

    <eval>    [loop] (loop)
    <eval>    [loop] (dynamic-wind (lambda () (mutex-lock! mutex)) (lambda () (step)) (lambda () (mutex-unlock! mutex)))
    <eval>    [loop] (mutex-lock! mutex)
    <eval>    [loop] (step)
    <eval>    [step] (car (quasiquote ()))  <--

我想从这样的崩溃中恢复(即解锁互斥锁,重新启动循环),但仍然有错误并打印了用于调试的跟踪。我对 (handle-exceptions … (step)) 的尝试没有成功,因为异常显然只包含 messageargumentslocation – 而不是踪迹。但是痕迹必须隐藏在某个地方,否则解释器无法打印它。有没有办法访问它?还是有其他方法可以在trace打印出来后恢复?

跟踪缓冲区是一个仅包含最近调用的环形缓冲区。不能用来回跳

您可能想阅读 this old CHICKEN Gazette issue,其中包含一个教程(搜索“煎蛋食谱”),介绍异常处理的工作原理以及可连续异常和不可连续异常之间的区别。如果你赶时间,真正的解释从“继续还是不继续——这是个问题”开始。