4

我正在使用 sbcl 1.0.57.0 并想启动一个程序,通过--eval该程序应该生成一些输出,但如果出现未捕获的错误,它将退出。

我认为最简单的方法是使用 unwind-protect:

(unwind-protect (error 'simple-error) 
  (progn (FORMAT t "IAMREACHED~%") (sb-ext:exit)))

(sb-ext:exit)应该执行,以防有未捕获的错误。

但事实并非如此!

* (unwind-protect (error 'simple-error) 

       (progn (FORMAT t "IAMREACHED~%") (sb-ext:exit)))

    debugger invoked on a SIMPLE-ERROR in thread
    #<THREAD "main thread" RUNNING {1002979193}>:
    (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*.)

    Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.

    restarts (invokable by number or by possibly-abbreviated name):
      0: [ABORT] Exit debugger, returning to top level.

    (#:EVAL-THUNK)
    0] 0
    IAMREACHED

我对 unwind-protect 的工作原理有什么误解?

4

3 回答 3

10

UNWIND-PROTECT是 Java 或 Python 中的子句的类似物finally,因此它不是一个包罗万象的子句,它将拦截任何未处理的条件。为此,您需要一个HANDLER-CASE带有处理程序子句的 type CONDITION

UNWIND-PROTECT实际上适用于您的情况。唯一的“意外”行为是在执行主体之前调用了调试器UNWIND-PROTECT。这样做的原因是为了不丢失当前上下文并能够重新开始执行。它(可能)通过HANDLER-BIND. 您可以在 PCL 章节“条件和重启”中了解更多信息。

于 2012-10-21T16:44:02.350 回答
2

也许您想禁用调试器,请参阅SBCL Toplevel Options

于 2012-10-21T21:31:47.400 回答
0

您可以使用 (ignore-errors) 来默默地忽略错误。或者您可以提前调用 sb-ext:disable-debugger 以仅在不启动调试器的情况下看到错误消息。

于 2013-11-08T08:05:00.060 回答