Pav*_*vel 1 error-handling sbcl common-lisp condition-system
我想捕获unbound-variable异常并避免它们,即时创建一些变量而不会中断执行。我正在尝试在以下代码中使用handler-bindwith invoke-restart:
(defmacro my-progn (&rest rest)
`(handler-bind
((unbound-variable
(lambda (x)
(progn
;(format t "UNBOUND VAR: ~a~%"
; (symbol-name (cell-error-name x)))
(invoke-restart 'just-continue)))))
(progn ,@(mapcar (lambda (x)
`(restart-case ,x (just-continue () "XXXX"))) rest))))
(my-progn
(print "AAA")
(print xxxx) ;; xxxx is unbound
(print "BBB"))
Run Code Online (Sandbox Code Playgroud)
结果是:
"AAA"
"BBB"
Run Code Online (Sandbox Code Playgroud)
但我想继续执行 second print,只需将未绑定的变量 xxxx 替换为字符串“XXXX”:
"AAA"
"XXXX"
"BBB"
Run Code Online (Sandbox Code Playgroud)
当然,我可以用 包裹语法树中的任何符号handler-bind,但我担心这会产生巨大的开销。
有没有办法只捕获unbound-variable异常并使用动态生成的值而不是丢失的变量继续执行代码?
您可以使用适当的标准重新启动 use-value。
(handler-bind
((unbound-variable
(lambda (c)
(declare (ignore c))
(use-value "XXXX"))))
(print "AAA")
(print xxxx)
(print "BBB"))
Run Code Online (Sandbox Code Playgroud)