Renvoyer une erreur dans Emacs Lisp

9

Je dois appeler une fonction et effectuer un nettoyage uniquement si la fonction échoue, puis relancer l'erreur. Voici le pseudo-code:

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

Réponses:

10

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.

Stefan
la source
1
Merci. Pourquoi ne pas condition-caseattraper keyboard-quit?
Elena
3
Parce que ce n'est pas une erreur (c'est-à-dire son signal,, 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».
Stefan
13

Vous recherchez signal:

(condition-case err
    (call-function)
  (error
   (cleanup)
   (signal (car err) (cdr err)))) ; reraise `err'
npostavs
la source
J'avais pensé signal, mais son prototype ne l'est (signal ERROR-SYMBOL DATA)pas (signal ERROR).
Elena
@Elena: désolé, tu l'as démonté avec caret cdr. Réponse mise à jour.
npostavs