是否有可能像这样重新启动:
(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”这样的常规重启,然后为其表达式中发出的任何条件调用正确的重启。
答案 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。