Error handling SBCL:编译期间是否继续重新启动?(事实上:在处理人案例中缺席) < >使用 SWIG/包装C++库,我一直试图绕过编译时错误E>代码> > EQL 常数被重新定义…在这种情况下,到相等< /COD>但UNU EQL字符串文字。
奇怪的是,在SLIME中,我能够简单地调用Error handling SBCL:编译期间是否继续重新启动?(事实上:在处理人案例中缺席) < >使用 SWIG/包装C++库,我一直试图绕过编译时错误E>代码> > EQL 常数被重新定义…在这种情况下,到相等< /COD>但UNU EQL字符串文字。,error-handling,common-lisp,sbcl,Error Handling,Common Lisp,Sbcl,奇怪的是,在SLIME中,我能够简单地调用CONTINUErestart并绕过这个特定错误。但是,当我尝试用处理程序案例包装它,并通过编译文件或slime编译文件或通过buildapp构建它时,继续重新启动似乎丢失了(格式t“重新启动:~{~%•~A~%:*~S~”(计算重新启动))一致。 我只是有点偏执,我试过: (continue) (invoke-restart 'continue) (invoke-restart (find-restart 'cl::continue)
CONTINUE
restart并绕过这个特定错误。但是,当我尝试用处理程序案例
包装它,并通过编译文件
或slime编译文件
或通过buildapp
构建它时,继续
重新启动似乎丢失了<代码>(格式t“重新启动:~{~%•~A~%:*~S~”(计算重新启动))一致。
我只是有点偏执,我试过:
(continue)
(invoke-restart 'continue)
(invoke-restart (find-restart 'cl::continue))
还有一些变化
(除非(继续)(警告“不能继续”)
也没有警告我,但编译也没有完成文件
由于一些更为严重的C++多态性案例,我想转换为关键字参数,我继续使用一个复制的和编辑的版本
(handler-case
(compile-file "path/to/swig-made-this-mess")
;; contains (defconstant foo "string")
#+sbcl
(SB-EXT:DEFCONSTANT-UNEQL (condition)
(let ((name (SB-EXT:DEFCONSTANT-UNEQL-NAME condition))
(before (SB-EXT:DEFCONSTANT-UNEQL-OLD-VALUE condition))
(after (SB-EXT:DEFCONSTANT-UNEQL-NEW-VALUE condition)))
(if (equal before after)
(progn
(warn "Redefining constant to un-EQL but EQUAL value~%~S ← ~S"
name after)
(unless (continue)
(warn "Unable to CONTINUE~%~%Restarts:~{~% • ~A~% ~:*~S~}"
(compute-restarts))
(signal condition)))
(progn
(warn "Redefining constant to un-EQUAL value:~%~S ←~%before: ~S~%after: ~S"
name before after)
(signal condition))))))
HANDLER-CASE不是正确的工具。在调用其子句时,堆栈已经展开。HANDLER-BIND的子句是在堆栈展开前发出错误信号的上下文中调用的,因此请改用HANDLER-BIND。d'oh。谢谢,我知道这一定是(:facepalm:)之类的事情,但我花了一个小时诊断错误的问题。