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 cleanupverrà chiamata non solo in caso di errore, ma anche se il codice viene interrotto da una C-go una chiamata a throw.
quitnon ha errortra i suoi genitori). IOW anche tu il furgone lo afferra, condition-casema per quello devi metterlo quitinsieme 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).
care cdr. Risposta aggiornata
condition-casecatturakeyboard-quit?