Réponses:
BTW, une option alternative peut être quelque chose comme:
(let ((error t))
(unwind-protect
(prog1 (call-function)
(setq error nil))
(when error (cleanup))))
L'avantage est que vous évitez d'attraper et de renvoyer l'erreur, ce qui signifie par exemple que le débogueur vous montrera la bonne trace (celle qui correspond à la source réelle de l'erreur, plutôt que celle qui correspond à vous renvoyant l'erreur de quelqu'un d'autre) ).
Une autre différence est que ce cleanupsera appelé non seulement en cas d'erreur mais aussi si le code est interrompu par un C-gou un appel à throw.
quitn'a pas errorparmi ses parents). OIEau vous van attraper aussi avec , condition-casemais pour que vous avez besoin de mettre quitainsi error. Bien sûr, cela ne gérera toujours pas le cas du «lancer».
Vous recherchez signal:
(condition-case err
(call-function)
(error
(cleanup)
(signal (car err) (cdr err)))) ; reraise `err'
signal, mais son prototype ne l'est (signal ERROR-SYMBOL DATA)pas (signal ERROR).
caret cdr. Réponse mise à jour.
condition-caseattraperkeyboard-quit?