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 cleanup
zostanie wywołany nie tylko w przypadku błędu, ale także, jeśli kod zostanie przerwany przez a C-g
lub wywołanie do throw
.
quit
nie ma go error
wśród rodziców). IOW ty van również złapać ją condition-case
, ale do tego trzeba umieścić quit
obok 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)
.
car
i cdr
. Odpowiedź zaktualizowana.
condition-case
złapaćkeyboard-quit
?