Отримати зворотній зв'язок від помилки програмно


12

Якщо сигнализируется помилка в коді Emacs Lisp, і debug-on-errorце t, я отримую трасування буфер , який дозволяє легко з'ясувати , де сталася помилка. Однак для помилок, які трапляються під час асинхронної обробки відповіді з мережі, було б дратувати спливаючий буфер зворотних треків, тому я б краще зафіксувати помилку condition-caseта записати її.

Отже, коли я обробляю помилку condition-case, чи є спосіб отримати доступ до зворотного треку в точці помилки? Виклик backtraceфункції отримує зворотній зв'язок коду всередині обробника, і це не те, що я шукаю.

(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-errorфункція робить щось подібне до цього, я думаю, але я зараз не за комп’ютером. Це може допомогти незалежно.
Шон Аллред

1
Це загальна проблема з будь-якою мовою, яка керує своїм стеком аналогічно. Спосіб вирішити це - сигналізувати про помилку, до якої вже додана інформація про стек. Тобто у вашому випадку ви створили б do-something-that-might-failстек-стежу та додали б її до помилки, яку вона викликає.
wvxvw

1
debbugs.gnu.org/cgi/bugreport.cgi?bug=24617#8 має пропозицію (я сам не пробував)
npostavs

Відповіді:


1

Найпростіше зробити це створити свій власний налагоджувач в середовищі, в якому виникає помилка. Це виходить приблизно так:

(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!

letСередовищі використовується лише для користувача функцію відладчика my-debuggerдля тривалості коди всередині нього, так що якщо ви зіткнулися помилки не-чіпати, «відладчик» буде працювати, який по суті просто виводить повідомлення. Цей налагоджувач працює в середовищі, де сталася помилка, тож ваш зворотний твір повідомить вам, що сталося.

Примітка. Цей код має дві (вирішувані) проблеми, які я залишу для вас. По-перше, ви, мабуть, хочете зняти перші кілька кадрів стека, оскільки вони стосуються виклику backtrace. По-друге, ви отримаєте повідомлення, яке також вказує на помилку (наприклад, у випадку вище, "хай: визначення функції Symbol є недійсним: foobar"). Ніяких величезних проблем, але я не хотів затуманити свою відповідь.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.