Odpowiedzi:
BTW, alternatywną opcją może być coś takiego:
(let ((error t))
(unwind-protect
(prog1 (call-function)
(setq error nil))
(when error (cleanup))))
Zaletą jest to, że unikasz wychwytywania i ponownego zgłaszania błędu, co oznacza na przykład, że debugger pokaże ci właściwy ślad wsteczny (ten, który odpowiada faktycznemu źródłu błędu, a nie ten, który odpowiada, że ponownie rzucasz błąd innej osoby ).
Inną różnicą jest to, że cleanupzostanie wywołany nie tylko w przypadku błędu, ale także, jeśli kod zostanie przerwany przez a C-glub wywołanie do throw.
quitnie ma go errorwśród rodziców). IOW ty van również złapać ją condition-case, ale do tego trzeba umieścić quitobok error. Oczywiście nadal nie poradzi sobie ze sprawą „rzucania”.
Poszukujesz signal:
(condition-case err
(call-function)
(error
(cleanup)
(signal (car err) (cdr err)))) ; reraise `err'
signal, ale jego prototyp (signal ERROR-SYMBOL DATA)nie (signal ERROR).
cari cdr. Odpowiedź zaktualizowana.
condition-casezłapaćkeyboard-quit?