我通过一个sbcl脚本调用我的common-lisp程序,该脚本使用必要的参数调用sbcl,并且我必须保证实际的程序完成调用后会干净地结束一些/没有输出。
我目前的解决方案如下所示:
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/错误,这将导致调用低级调试器。
发布于 2012-12-21 11:01:09
--non-interactive开关将确保SBCL永远不会进入调试器或REPL。这类似于传递--disable-debugger并使用--eval "(sb-ext:quit)"。如果您不希望sb-ext:*invoke-debugger-hook*在发生错误时打印回溯,您还可以自定义它。
https://stackoverflow.com/questions/13983447
复制相似问题