Si une erreur est signalée dans le code Emacs Lisp, et debug-on-error
c'est le cas t
, j'obtiens un tampon de retour arrière qui permet de déterminer facilement où l'erreur s'est produite. Cependant, pour les erreurs qui se produisent lors du traitement d'une réponse du réseau de manière asynchrone, il serait ennuyeux de faire apparaître le tampon de trace, donc je préfère attraper l'erreur avec condition-case
et l'enregistrer.
Donc, lorsque je gère une erreur condition-case
, y a-t-il un moyen d'accéder à la trace arrière au point de l'erreur? L'appel de la backtrace
fonction récupère la trace du code à l'intérieur du gestionnaire, ce qui n'est pas ce que je recherche.
(condition-case e
(do-something-that-might-fail)
(error
(message "%s"
;; This gets the wrong backtrace!
(with-temp-buffer
(let ((standard-output (current-buffer)))
(backtrace)
(buffer-string))))))
debugging
error-handling
backtrace
legoscia
la source
la source
magithub-error
fonction fait quelque chose de similaire, je pense, mais je ne suis pas devant un ordinateur en ce moment. Cela peut aider malgré tout.do-something-that-might-fail
généré une trace de pile et l' auriez attachée à l'erreur qu'elle soulève.Réponses:
La chose la plus simple à faire est de créer votre propre débogueur dans l'environnement dans lequel l'erreur se produit. Cela va quelque chose comme ceci:
L'
let
environnement utilise cette fonction de débogage personnalisémy-debugger
pour la durée du code qu'il contient. Par conséquent, si vous rencontrez une erreur non gérée, le "débogueur" s'exécute, qui imprime essentiellement le message. Ce débogueur s'exécute dans l'environnement où l'erreur s'est produite, donc votre trace vous dira ce qui s'est passé.Remarque: ce code présente deux problèmes (résolubles) que je vous laisse. Tout d'abord, vous souhaiterez probablement supprimer les premières images de la pile, car elles concernent l'invocation de
backtrace
. Deuxièmement, vous obtiendrez un message indiquant également l'erreur (par exemple, dans le cas ci-dessus, "let: la définition de la fonction du symbole est void: foobar"). Les problèmes ne sont pas non plus énormes, mais je ne voulais pas brouiller ma réponse.la source