Jeśli w kodzie Emacs Lisp zasygnalizowany jest błąd, debug-on-error
pojawia t
się bufor śledzenia, który ułatwia ustalenie, gdzie wystąpił błąd. Jednak w przypadku błędów, które występują podczas asynchronicznego przetwarzania odpowiedzi z sieci, denerwujące byłoby pojawienie się bufora śledzenia wstecznego, więc wolę wychwycić błąd condition-case
i zarejestrować go.
Kiedy więc zajmuję się błędem condition-case
, czy istnieje sposób na uzyskanie dostępu do śledzenia wstecznego w momencie wystąpienia błędu? Wywołanie backtrace
funkcji pobiera ślad kodu wewnątrz modułu obsługi, czego nie szukam.
(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
źródło
źródło
magithub-error
Myślę, że moja funkcja robi coś podobnego, ale nie jestem teraz przy komputerze. Może to pomóc niezależnie.do-something-that-might-fail
wygenerowałbyś śledzenie stosu i dołączasz go do zgłaszanego błędu.Odpowiedzi:
Najprościej jest stworzyć własny debugger w środowisku, w którym występuje błąd. To idzie mniej więcej tak:
let
Środowisko wykorzystuje tę niestandardową funkcję debuggeramy-debugger
na okres kodu wewnątrz niego, więc jeśli wystąpi błąd un-obsłużony, „debugger” będzie działać, co w zasadzie tylko wypisuje komunikat. Ten debugger działa w środowisku, w którym wystąpił błąd, więc ślad śledzenia powie ci, co się stało.Uwaga: w tym kodzie występują dwa (możliwe do rozwiązania) problemy, które pozostawię tobie. Najpierw prawdopodobnie chcesz usunąć kilka pierwszych ramek stosu, ponieważ odnoszą się one do wywołania
backtrace
. Po drugie, otrzymasz także komunikat wskazujący błąd (na przykład w powyższym przypadku „let: definicja funkcji symbolu jest nieważna: foobar”). Nie są to też duże problemy, ale nie chciałem zabłocić mojej odpowiedzi.źródło