Error handling 在Common Lisp中捕获但继续从警告

Error handling 在Common Lisp中捕获但继续从警告,error-handling,warnings,common-lisp,Error Handling,Warnings,Common Lisp,有没有一种方法可以收集警告,但仍然执行与之相关的代码 我的第一个想法是使用处理程序case获取所有条件,然后从警告中继续,但是SBCL中的SimpleWarning似乎没有继续重新启动 CL-USER> (handler-case (warn "Nope") (t (c) c)) #<SIMPLE-WARNING "Nope" {1008080D53}> CL-USER> (compute-restarts (handler-case (warn "Nope") (t (

有没有一种方法可以收集警告,但仍然执行与之相关的代码

我的第一个想法是使用
处理程序case
获取所有条件,然后从警告中继续,但是SBCL中的
SimpleWarning
似乎没有
继续
重新启动

CL-USER> (handler-case (warn "Nope") (t (c) c))
#<SIMPLE-WARNING "Nope" {1008080D53}>
CL-USER> (compute-restarts (handler-case (warn "Nope") (t (c) c)))
(#<RESTART SWANK::RETRY {10080867F3}> #<RESTART ABORT {1004710323}>
 #<RESTART ABORT {1004710073}>)
CL-USER> 
CL-USER>(处理器案例(警告“否”)(t(c)c))
#
CL-USER>(计算重新启动(处理程序案例(警告“Nope”)(t(c)c)))
(# #
#)
CL-USER>

处理程序案例
在条件与其某个子句匹配时展开。您应该使用
处理程序绑定

您需要查找
警告
实际执行的操作。默认情况下,它会打印一条警告。如果您想访问condition对象,则需要编写一个处理程序。只是从处理程序返回已经在继续。如果要清除打印的警告,请在处理程序中调用
MUFFLE-warning
<代码>消音器警告使用相同名称的重新启动

CL-USER 32 > (let ((conditions ))
               (handler-bind ((t (lambda (c) (push c conditions))))
                 (warn "foo")
                 (warn "bar")
                 (format t "~%baz"))
               conditions)
Warning: foo
Warning: bar
baz
(#<SIMPLE-WARNING 402011C9B3> #<SIMPLE-WARNING 402011C63B>)
CL-USER 32>(let((条件))
(处理器绑定((t(lambda(c)(推c条件)))
(警告“foo”)
(警告“酒吧”)
(格式t“~%baz”))
条件)
警告:富
警告:酒吧
巴兹
(# #)

为什么要继续重新启动?此外,条件不会“重新启动”。