Ответы:
Кстати, альтернативный вариант может быть что-то вроде:
(let ((error t))
(unwind-protect
(prog1 (call-function)
(setq error nil))
(when error (cleanup))))
Преимущество состоит в том, что вы избегаете перехвата и повторного выброса ошибки, что означает, например, что отладчик покажет вам правильную обратную трассировку (ту, которая соответствует фактическому источнику ошибки, а не ту, которая соответствует повторной выдаче чужой ошибки). ).
Другое отличие состоит в том, что cleanupон будет вызван не только при ошибке, но также и в том случае, если код прерывается C-gвызовом или throw.
quitне имеет errorсреди своих родителей). IOW вы также поймать его, condition-caseно для этого нужно положить quitвместе error. Конечно, это все равно не справится с делом `throw '.
Вы ищете signal:
(condition-case err
(call-function)
(error
(cleanup)
(signal (car err) (cdr err)))) ; reraise `err'
signal, но его прототип есть (signal ERROR-SYMBOL DATA), нет (signal ERROR).
carи cdr. Ответ обновлен.
condition-caseпойматьkeyboard-quit?