1

是否可以像这样在重新启动时手把手地移动:

(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”这样的一般重启,然后针对其表达式中发出的任何条件调用正确的重启。

4

2 回答 2

1

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

Common Lisp 条件系统有几个基本概念:

  • 条件,通常实现为 CLOS 类

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

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

  • 重新启动。然后重新启动负责摆脱这种状况。将控制权转移到重新启动使我们摆脱了错误上下文。我们可以通过“UNWIND-PROTECT”强​​制执行代码。一旦我们重新启动,发出条件信号的上下文就消失了。

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

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

有关条件系统概念的一些背景信息,请参见 Kent Pitman 的这篇文章:Lisp 语言家族中的条件处理

于 2012-08-23T07:27:47.870 回答
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

于 2012-08-21T18:01:50.510 回答