Error handling 如何在重新启动时手动移动

Error handling 如何在重新启动时手动移动,error-handling,common-lisp,Error Handling,Common Lisp,是否可以像这样在重新启动时进行手动移动: (handler-bind ((simple-error #'(lambda(condition) (write condition) (invoke-restart 'alle condition)))) (restart-case (restart-case (error 'simple-error) (nex

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

(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))))
(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|#))
这目前导致了

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

我希望能够实现像“只记录所有条件”这样的常规重启,然后对其表达式中显示的任何条件调用正确的重启。

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

(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))))
(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|#))

有关详细信息,请参阅。

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

(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))))
(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|#))

有关详细信息,请参阅。

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

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

  • 条件,通常作为CLOS类实现

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

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

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

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

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


有关条件系统思想的一些背景信息,请参阅Kent Pitman的本文:

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

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

  • 条件,通常作为CLOS类实现

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

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

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

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

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


有关条件系统思想的一些背景信息,请参阅Kent Pitman的本文:

你可以看看这是否真的是你想要做的。。。通常,您希望处理程序选择最佳重启。处理程序会看到所有可用的重新启动。从重启到重启是不寻常的。依我拙见在某些情况下,也没有“正确”的重新启动。可能会有几次重启可用且有用。这可以由用户以编程方式或交互方式确定。在几种不同的情况下,重启可能也很有用。事实上,你是对的,在我看来,这是一个设计错误。把你的答案作为评论贴出来,我会接受的。不过,一个更全面的答案可能对未来的用户更有用。你可以检查一下这是否真的是你想要做的。。。通常,您希望处理程序选择最佳重启。处理程序会看到所有可用的重新启动。从重启到重启是不寻常的。依我拙见在某些情况下,也没有“正确”的重新启动。可能会有几次重启可用且有用。这可以由用户以编程方式或交互方式确定。在几种不同的情况下,重启可能也很有用。事实上,你是对的,在我看来,这是一个设计错误。把你的答案作为评论贴出来,我会接受的。不过,一个更全面的答案可能对未来的用户更有用。