Wenn im Emacs-Lisp-Code ein Fehler gemeldet wird und dies der Fall debug-on-error
ist t
, erhalte ich einen Rückverfolgungspuffer, mit dem sich leicht herausfinden lässt, wo der Fehler aufgetreten ist. Bei Fehlern, die bei der asynchronen Verarbeitung einer Antwort aus dem Netzwerk auftreten, wäre es jedoch ärgerlich, wenn der Rückverfolgungspuffer eingeblendet würde. Daher würde ich den Fehler lieber mit abfangen condition-case
und protokollieren.
Gibt condition-case
es eine Möglichkeit, bei der Behandlung eines Fehlers in auf die Rückverfolgung zuzugreifen, wenn der Fehler auftritt? Das Aufrufen der backtrace
Funktion ruft die Rückverfolgung des Codes im Handler ab, was nicht das ist, wonach ich suche.
(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
quelle
quelle
magithub-error
Ich denke, meine Funktion macht etwas Ähnliches, aber ich bin gerade nicht an einem Computer. Es kann trotzdem helfen.do-something-that-might-fail
einen Stack-Trace generieren und ihn an den Fehler anhängen, den er verursacht.Antworten:
Am einfachsten ist es, einen eigenen Debugger in der Umgebung zu erstellen, in der der Fehler auftritt. Das geht ungefähr so:
Die
let
Umgebung verwendet diese benutzerdefinierte Debugger-Funktionmy-debugger
für die Dauer des darin enthaltenen Codes. Wenn Sie also auf einen nicht behandelten Fehler stoßen, wird der "Debugger" ausgeführt, der im Wesentlichen nur die Nachricht druckt. Dieser Debugger wird in der Umgebung ausgeführt, in der der Fehler aufgetreten ist. In Ihrem Backtrace erfahren Sie also, was passiert ist.Hinweis: Dieser Code hat zwei (lösbare) Probleme, die ich für Sie hinterlassen werde. Zunächst möchten Sie wahrscheinlich die ersten Stapelrahmen entfernen, da sie sich auf den Aufruf von beziehen
backtrace
. Zweitens erhalten Sie eine Meldung, die auf den Fehler hinweist (im obigen Fall beispielsweise "let: Die Funktionsdefinition von Symbol ist ungültig: foobar"). Weder sind riesige Probleme, aber ich wollte meine Antwort nicht verwirren.quelle