I need to call a function and perform a cleanup only if the function fails, and then relaunch the error. Here is the pseudo-code:
(condition-case err
(call-function)
(error
(cleanup)
;; how do I raise `err`?
))
I need to call a function and perform a cleanup only if the function fails, and then relaunch the error. Here is the pseudo-code:
(condition-case err
(call-function)
(error
(cleanup)
;; how do I raise `err`?
))
You're looking for signal
:
(condition-case err
(call-function)
(error
(cleanup)
(signal (car err) (cdr err)))) ; reraise `err'
BTW, an alternative option can be something like:
(let ((error t))
(unwind-protect
(prog1 (call-function)
(setq error nil))
(when error (cleanup))))
The advantage is that you avoid catching&rethrowing the error, which means for example that the debugger will show you the right backtrace (the one that corresponds to the actual source of the error, rather than the one that corresponds to you re-throwing someone else's error).
Another differences is that cleanup
will be called not only upon error but also if the code is interrupted by a C-g
or a call to throw
.
quit
, does not have error
among its parents). IOW you van also catch it with condition-case
but for that you need to put quit
along with error
. Of course, that still won't handle the `throw' case.
– Stefan
Jul 08 '15 at 13:41
unwind-protect
is a neater alternative to fine-grained exception handling with condition-case
.
– mindthief
Nov 23 '20 at 03:02
signal
, but its prototype is(signal ERROR-SYMBOL DATA)
, not(signal ERROR)
. – Eleno Jul 04 '15 at 15:40car
andcdr
. Answer updated. – npostavs Jul 04 '15 at 15:46