Emacs Lisp에서 오류 재발생 에만 함수를 호출하고

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

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


답변

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

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

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

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


답변

당신이 찾고있는 것 signal:

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