Respuestas:
Por cierto, una opción alternativa puede ser algo como:
(let ((error t))
(unwind-protect
(prog1 (call-function)
(setq error nil))
(when error (cleanup))))
La ventaja es que evita atrapar y volver a lanzar el error, lo que significa, por ejemplo, que el depurador le mostrará la traza inversa correcta (la que corresponde a la fuente real del error, en lugar de la que corresponde a que usted vuelva a lanzar el error de otra persona) )
Otra diferencia es que cleanup
se llamará no solo en caso de error, sino también si el código se interrumpe por una C-g
o una llamada a throw
.
quit
no tiene error
entre sus padres). IOW con el que también puedes atraparlo, condition-case
pero para eso debes llevarlo quit
bien error
. Por supuesto, eso todavía no manejará el caso de "lanzamiento".
Estas buscando signal
:
(condition-case err
(call-function)
(error
(cleanup)
(signal (car err) (cdr err)))) ; reraise `err'
signal
, pero su prototipo (signal ERROR-SYMBOL DATA)
no lo es (signal ERROR)
.
car
y cdr
. Respuesta actualizada
condition-case
atraparkeyboard-quit
?