我正在通过一个调用了必要参数的shell脚本来调用我的common-lisp程序,并且我需要确保无论实际程序如何完成,调用都会以干净的状态结束,不会有任何输出。目前我的解决方案如下:
但在以下两种情况下它将无法起作用:
我现在想知道是否有另一种解决方案,可以捕获所调用程序的任何可能结果,并确保 sbcl 调用将干净退出?
对于第一个场景,一个不指定要捕获什么的通用 catch 可能会起到作用。第二个场景必须能够处理导致调用低级别调试器的错误或 bug。
sbcl --eval "(unwind-protect
(handler-case
(progn
(declaim #+sbcl(sb-ext:muffle-conditions style-warning))
(let ((*standard-output* (make-broadcast-stream)))
(ql:quickload \"module\"))
(eval (read-from-string \"(package:start)\"))) ;this starts the program
(error (err)
(FORMAT t \"Something went really wrong:~a~%\" err)
(sb-ext:exit)))
(sb-ext:exit))"
但在以下两种情况下它将无法起作用:
sbcl --eval "(unwind-protect
(handler-case
(progn
(define-condition bad () ())
(error 'bad))
(error (err)
(FORMAT t \"Something went really wrong:~a~%\" err)
(sb-ext:exit)))
(sb-ext:exit))"
sbcl --eval "(unwind-protect
(handler-case
(progn
(labels ((rek () (rek)))
(rek)))
(error (err)
(FORMAT t \"Something went really wrong:~a~%\" err)
(sb-ext:exit)))
(sb-ext:exit))"
我现在想知道是否有另一种解决方案,可以捕获所调用程序的任何可能结果,并确保 sbcl 调用将干净退出?
对于第一个场景,一个不指定要捕获什么的通用 catch 可能会起到作用。第二个场景必须能够处理导致调用低级别调试器的错误或 bug。