我需要调用一个函数并仅在该函数失败时执行清理,然后重新启动该错误。这是伪代码:
(condition-case err
(call-function)
(error
(cleanup)
;; how do I raise `err`?
))
我需要调用一个函数并仅在该函数失败时执行清理,然后重新启动该错误。这是伪代码:
(condition-case err
(call-function)
(error
(cleanup)
;; how do I raise `err`?
))
Answers:
顺便说一句,另一种选择可以是:
(let ((error t))
(unwind-protect
(prog1 (call-function)
(setq error nil))
(when error (cleanup))))
优点是您避免捕获并重新抛出错误,例如,这意味着调试器将向您显示正确的回溯(与错误的实际来源相对应的回溯,而不是与重新引发其他人的错误相对应的回溯。 )。
另一个区别是,cleanup
不仅会在出错时调用,还会在代码被a C-g
或调用中断时调用throw
。
quit
没有error
)。督察你面包车也抓住它condition-case
,但对于你需要把quit
沿error
。当然,这仍然无法解决“引发”的情况。
您正在寻找signal
:
(condition-case err
(call-function)
(error
(cleanup)
(signal (car err) (cdr err)))) ; reraise `err'
signal
,但它的原型(signal ERROR-SYMBOL DATA)
不是(signal ERROR)
。
car
和拆开了cdr
。答案已更新。
condition-case
赶上keyboard-quit
?