Obtenga retroceso del error mediante programación


12

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

1
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.
Sean Allred

1
Ese es un problema general con cualquier lenguaje que maneje su stack de manera similar. Una forma de manejar eso es señalar un error que ya tiene información de pila adjunta. Es decir, en su caso, debería do-something-that-might-failgenerar un seguimiento de pila y adjuntarlo al error que genera.
wvxvw

1
debbugs.gnu.org/cgi/bugreport.cgi?bug=24617#8 tiene una sugerencia (no lo he probado yo mismo)
npostavs

Respuestas:


1

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í:

(defun my-debugger (&rest debugger-args)
  (message "BACKTRACE: %s"
           (with-temp-buffer
             (let ((standard-output (current-buffer)))
               (backtrace)
               (buffer-string)))))

(let ((debugger #'my-debugger))
  (foobar)) ; Runs a function with no definition!

El letentorno utiliza esta función de depuración personalizada my-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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.