Ответы:
Кстати, альтернативный вариант может быть что-то вроде:
(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
?