Antworten:
Übrigens kann eine alternative Option so etwas sein wie:
(let ((error t))
(unwind-protect
(prog1 (call-function)
(setq error nil))
(when error (cleanup))))
Der Vorteil besteht darin, dass Sie vermeiden, den Fehler abzufangen und erneut zu werfen. Dies bedeutet beispielsweise, dass der Debugger Ihnen die richtige Rückverfolgung anzeigt (diejenige, die der tatsächlichen Fehlerquelle entspricht, und nicht diejenige, die dem erneuten Auslösen des Fehlers einer anderen Person entspricht ).
Ein weiterer Unterschied besteht darin, dass cleanup
nicht nur bei einem Fehler aufgerufen wird, sondern auch, wenn der Code durch einen C-g
oder einen Aufruf von unterbrochen wird throw
.
quit
, hat nicht error
unter seinen Eltern). IOW Sie van fangen sie auch mit , condition-case
aber dafür müssen Sie setzen quit
mit zusammen error
. Natürlich wird das den "Wurf" -Fall immer noch nicht behandeln.
Sie suchen signal
:
(condition-case err
(call-function)
(error
(cleanup)
(signal (car err) (cdr err)))) ; reraise `err'
signal
, aber sein Prototyp ist (signal ERROR-SYMBOL DATA)
nicht (signal ERROR)
.
car
und auseinander gezogen cdr
. Antwort aktualisiert.
condition-case
fangenkeyboard-quit
?