如何在重新启动时移动手

时间:2012-08-21 15:34:38

标签: error-handling common-lisp

是否有可能像这样重新启动:

(handler-bind ((simple-error #'(lambda(condition)
                       (write condition)
                       (invoke-restart 'alle condition))))
    (restart-case
      (restart-case
        (error 'simple-error)
       (next (err)))
      (alle (err) (invoke-restart 'next))))

这导致了

No restart NEXT is active.
   [Condition of type SB-INT:SIMPLE-CONTROL-ERROR]

我希望能够实现像“just-log-all-conditions”这样的常规重启,然后为其表达式中发出的任何条件调用正确的重启。

2 个答案:

答案 0 :(得分:1)

您可能会检查这是否真的是您想要做的...通常您希望处理程序选择最佳重启。处理程序看到所有可用的重新启动。从重启到重启是不寻常的。恕我直言。某些情况也没有'正确'重启。几次重启可能是有用的。这可以由用户以编程方式或交互方式确定。重启可能对几种不同的条件有用。

Common Lisp Condition System有几个基本概念:

  • 条件,通常以CLOS类实现

  • 发送信号条件对象,通常在用户代码中完成。

  • 处理条件。根据条件选择并调用处理程序。当处理程序运行时,它可以检查并决定要做什么。处理程序通常拒绝处理条件或选择一个可用的重新启动。在典型的开发环境中,这可能涉及显示重新启动并要求用户进行选择。

  • <强>重新启动即可。然后重启将负责摆脱条件情况。对重启的控制转移使我们脱离错误上下文。我们可以通过'UNWIND-PROTECT'强制执行代码。一旦我们重新启动,条件被发出信号的上下文就消失了。

这意味着只有处理程序才能看到所有可用的重启,而处理程序也可以将控制转移到下一个处理程序。

跳转从重启到重启并不是这个模型的一部分。

关于条件系统理念的一些背景,请参阅Kent Pitman撰写的这篇文章:Condition Handling in the Lisp Language Family

答案 1 :(得分:0)

您应该以相反的顺序指定所有内容,如下所示:

(restart-case
    (restart-case
        (handler-bind ((simple-error #'(lambda(condition)
                                         (write condition)
                                         (invoke-restart 'alle condition))))
          (error 'simple-error))
      (alle (err) (invoke-restart 'next)))
  (next () #|do nothing|#))

有关详细信息,请参阅CLHS