Risposte:
A proposito, un'opzione alternativa può essere qualcosa di simile:
(let ((error t))
(unwind-protect
(prog1 (call-function)
(setq error nil))
(when error (cleanup))))
Il vantaggio è che eviti di catturare e ricrescere l'errore, il che significa ad esempio che il debugger ti mostrerà il giusto backtrace (quello che corrisponde alla fonte effettiva dell'errore, piuttosto che quello che corrisponde a te nel ripetere l'errore di qualcun altro ).
Un'altra differenza è che cleanup
verrà chiamata non solo in caso di errore, ma anche se il codice viene interrotto da una C-g
o una chiamata a throw
.
quit
non ha error
tra i suoi genitori). IOW anche tu il furgone lo afferra, condition-case
ma per quello devi metterlo quit
insieme error
. Ovviamente, questo non gestirà ancora il caso del lancio.
Stai cercando signal
:
(condition-case err
(call-function)
(error
(cleanup)
(signal (car err) (cdr err)))) ; reraise `err'
signal
, ma il suo prototipo (signal ERROR-SYMBOL DATA)
non lo è (signal ERROR)
.
car
e cdr
. Risposta aggiornata
condition-case
catturakeyboard-quit
?