Emacs Lisp에서 오류 재발생


9

함수가 실패한 경우 에만 함수를 호출하고 정리를 수행 한 다음 오류를 다시 시작해야합니다. 의사 코드는 다음과 같습니다.

(condition-case err
    (call-function)
  (error
   (cleanup)
   ;; how do I raise `err`?
   ))

답변:


10

BTW, 대체 옵션은 다음과 같습니다.

(let ((error t))
  (unwind-protect
      (prog1 (call-function)
        (setq error nil))
    (when error (cleanup))))

장점은 오류를 잡아서 다시 던지는 것을 피한다는 것입니다. 예를 들어 디버거는 올바른 역 추적 (다른 사람의 오류를 다시 던지는 것에 해당하는 것이 아니라 실제 오류의 원인에 해당하는)을 표시합니다. ).

또 다른 차이점은 cleanup오류 발생시뿐만 아니라 C-g또는에 대한 호출로 코드가 중단 된 경우에도 호출됩니다 throw.


1
감사. 왜 condition-case잡을 수 keyboard-quit없습니까?
Elena

3
오류가 아니기 때문에 (즉, 신호, 부모 사이에 quit없음 error). IOW 당신은 ​​또한 그것을 잡을 수 condition-case있지만 그 quit와 함께 넣어야 error합니다. 물론, 여전히 'throw'사례를 처리하지는 않습니다.
Stefan

13

당신이 찾고있는 것 signal:

(condition-case err
    (call-function)
  (error
   (cleanup)
   (signal (car err) (cdr err)))) ; reraise `err'

나는 생각 signal했지만 프로토 타입은 (signal ERROR-SYMBOL DATA)그렇지 않다 (signal ERROR).
Elena

@Elena : 죄송합니다,와 ( car과) 분리했습니다 cdr. 답변이 업데이트되었습니다.
npostavs
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.