Si se señala un error en el código Emacs Lisp, y debug-on-errores así t, obtengo un búfer de seguimiento que hace que sea fácil averiguar dónde ocurrió el error. Sin embargo, para los errores que ocurren mientras se procesa una respuesta de la red de forma asincrónica, sería molesto que aparezca el búfer de rastreo, así que prefiero detectar el error condition-casey registrarlo.
Entonces, cuando estoy manejando un error condition-case, ¿hay alguna forma de obtener acceso a la traza inversa en el punto del error? Llamar a la backtracefunción obtiene la traza inversa del código dentro del controlador, que no es lo que estoy buscando.
(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
fuente
fuente

magithub-errorCreo que mi función hace algo similar a esto, pero no estoy en una computadora en este momento. Puede ayudar de todos modos.do-something-that-might-failgenerar un seguimiento de pila y adjuntarlo al error que genera.Respuestas:
Lo más fácil es crear su propio depurador en el entorno en el que se produce el error. Eso va más o menos así:
El
letentorno utiliza esta función de depuración personalizadamy-debuggerdurante la duración del código que contiene , por lo que si encuentra un error no manejado, se ejecutará el "depurador", que esencialmente solo imprime el mensaje. Este depurador se ejecuta en el entorno donde se produjo el error, por lo que su seguimiento le dirá lo que sucedió.Nota: Este código tiene dos problemas (solucionables) que te dejaré. En primer lugar, probablemente desee quitar los primeros fotogramas de la pila, ya que pertenecen a la invocación de
backtrace. En segundo lugar, recibirá un mensaje que también indica el error (por ejemplo, en el caso anterior, "let: la definición de la función del símbolo es nula: foobar"). Tampoco son grandes problemas, pero no quería enturbiar mi respuesta.fuente