重新抛出Emacs Lisp中的错误


9

我需要调用一个函数并在该函数失败时执行清理,然后重新启动该错误。这是伪代码:

(condition-case err
    (call-function)
  (error
   (cleanup)
   ;; how do I raise `err`?
   ))

Answers:


10

顺便说一句,另一种选择可以是:

(let ((error t))
  (unwind-protect
      (prog1 (call-function)
        (setq error nil))
    (when error (cleanup))))

优点是您避免捕获并重新抛出错误,例如,这意味着调试器将向您显示正确的回溯(与错误的实际来源相对应的回溯,而不是与重新引发其他人的错误相对应的回溯。 )。

另一个区别是,cleanup不仅会在出错时调用,还会在代码被a C-g或调用中断时调用throw


1
谢谢。为什么不condition-case赶上keyboard-quit
Elena'7

3
因为这不是错误(即其信号,,在其父级之间quit没有error)。督察你面包车也抓住它condition-case,但对于你需要把quit沿error。当然,这仍然无法解决“引发”的情况。
Stefan

13

您正在寻找signal

(condition-case err
    (call-function)
  (error
   (cleanup)
   (signal (car err) (cdr err)))) ; reraise `err'

我曾考虑过signal,但它的原型(signal ERROR-SYMBOL DATA)不是(signal ERROR)
Elena 2015年

@Elena:对不起,您已经用car和拆开了cdr。答案已更新。
npostavs 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.