プログラムからエラーからバックトレースを取得する


12

エラーがEmacs Lispのコードに合図し、されている場合debug-on-errort、私はエラーが発生した場所、それが簡単に把握することができますバックトレースバッファを取得します。ただし、ネットワークからの応答を非同期で処理しているときに発生するエラーの場合、バックトレースバッファーをポップアップ表示するのは面倒なので、エラーをキャッチし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、あなたが非取り扱わエラーが発生しそうならば、その内のコードの期間中、「デバッガ」は、本質的にだけメッセージを出力しており、実行されます。このデバッガーは、エラーが発生した環境で実行されるため、バックトレースで何が起こったかがわかります。

注:このコードには、2つの(解決可能な)問題があります。まず、おそらくの呼び出しに関係するため、最初のいくつかのスタックフレームを削除する必要がありますbacktrace。次に、エラーも示すメッセージが表示されます(たとえば、上記の場合、「let:Symbolの関数定義はvoid:foobar」です)。どちらも大きな問題ではありませんが、私は自分の反応を汚したくありませんでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.