프로그래밍 방식으로 오류에서 역 추적 받기


12

오류가 이맥스 리스프 코드 신호, 그리고 경우 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기능은 내가 생각하는 것과 비슷한 것을하지만 지금은 컴퓨터에 없습니다. 상관없이 도움이 될 수 있습니다.
Sean Allred

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. 둘째, 오류를 나타내는 메시지도 표시됩니다 (예 : "let : Symbol의 함수 정의가 void : foobar"인 경우). 둘 다 큰 문제는 아니지만 응답을 어지럽히고 싶지 않았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.