함수가 실패한 경우 에만 함수를 호출하고 정리를 수행 한 다음 오류를 다시 시작해야합니다. 의사 코드는 다음과 같습니다.
(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'