我需要调用一个函数并仅在该函数失败时执行清理,然后重新启动该错误。这是伪代码:
(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?