Respostas:
BTW, uma opção alternativa pode ser algo como:
(let ((error t))
(unwind-protect
(prog1 (call-function)
(setq error nil))
(when error (cleanup))))
A vantagem é que você evita capturar e repetir o erro, o que significa, por exemplo, que o depurador mostrará o backtrace correto (aquele que corresponde à fonte real do erro, em vez daquele que corresponde a você repetir o erro de outra pessoa) )
Outra diferença é que cleanup
será chamado não apenas por erro, mas também se o código for interrompido por uma C-g
ou uma chamada para throw
.
quit
não tem error
entre seus pais). IOW você van também pegá-lo, condition-case
mas para isso você precisa colocar quit
junto error
. Obviamente, isso ainda não vai lidar com o caso 'throw'.
Você está procurando signal
:
(condition-case err
(call-function)
(error
(cleanup)
(signal (car err) (cdr err)))) ; reraise `err'
signal
, mas seu protótipo (signal ERROR-SYMBOL DATA)
não é (signal ERROR)
.
car
e cdr
. Resposta atualizada.
condition-case
pegariakeyboard-quit
?