Si se señala un error en el código Emacs Lisp, y debug-on-error
es 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-case
y 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 backtrace
funció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-error
Creo 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-fail
generar 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
let
entorno utiliza esta función de depuración personalizadamy-debugger
durante 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