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`?
   ))

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.


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'

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.