Programlı olarak hatadan geri izleme alın


12

Emacs Lisp kodunda bir hata belirtilirse ve debug-on-errorise t, hatanın nerede oluştuğunu anlamayı kolaylaştıran bir geri izleme arabelleği alırım. Ancak, ağdan bir yanıt zaman uyumsuz olarak işlenirken oluşan hatalar için, geri izleme arabelleğinin açılmasını rahatsız edici olacaktır, bu yüzden hatayı yakalamak condition-caseve günlüğe kaydetmeyi tercih ederim .

Yani bir hatayı işlerken, hata condition-casenoktasındaki geri izlemeye erişmenin bir yolu var mı? backtraceİşlevi çağırmak, işleyicinin içindeki kodun geri izlemesini alır, bu aradığım şey değil.

(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
Benim magithub-errorişlevi bence buna benzer bir şey yok, ama şu anda bir bilgisayar başında değilim. Ne olursa olsun yardımcı olabilir.
Sean Allred

1
Bu, yığınını benzer şekilde yöneten herhangi bir dilde genel bir sorundur. Bunu işlemenin bir yolu, zaten yığın bilgisi eklenmiş bir hatayı bildirmektir. Yani sizin durumunuzda, do-something-that-might-failyığın izi oluşturup ortaya çıkardığı hataya eklersiniz.
wvxvw

1
debbugs.gnu.org/cgi/bugreport.cgi?bug=24617#8 bir öneri var (kendim denemedim)
npostavs

Yanıtlar:


1

Yapılacak en kolay şey, hatanın oluştuğu ortamda kendi hata ayıklayıcınızı oluşturmaktır. Böyle bir şey gider:

(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Çevre bu özel ayıklayıcı fonksiyonunu kullanır my-debuggerBir un saplı hatasıyla karşılaşırsanız eğer öyleyse, bunun içindeki kod süresince, "ayıklayıcı" esasen sadece mesajını yazdıran çalışacaktır. Bu hata ayıklayıcı, hatanın oluştuğu ortamda çalışır, böylece geri izlemeniz ne olduğunu size bildirir.

Not: Bu kodda sizin için bırakacağım iki (çözülebilir) sorun var. İlk olarak, muhtemelen çağrılma ile ilgili olarak ilk birkaç yığın çerçevesini çıkarmak istersiniz backtrace. İkinci olarak, hatayı belirten bir mesaj alırsınız (örneğin, yukarıdaki durumda, "let: Symbol işlev tanımı geçersizdir: foobar"). İkisi de büyük problemler değil, ama cevabımı çamurlamak istemedim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.