The 'unwind-protect' special form allows the protecting [trapping] of
all forms of exit from the 'protect-form'. The exits that are trapped
include errors,
Note: 'unwind-protext' will not protect against errors signalled
by
(unwind-protect
(+ 2 2) ; protected form
(print "an exit")) ; clean up form
; prints "an exit"
; returns 4
(setq *breakenable* nil) ; to turn off break loop traps
(unwind-protect
(+ 1 "2") ; protected form
(print "something happened")) ; clean up form
; error: bad argument type - "2"
; prints "something happened"
(catch 'mytag
(unwind-protect
(throw 'mytag) ; protected form
(print "an exit"))) ; clean up form
; prints "an exit"
(setq *breakenable* nil) ; to turn off break loop traps
(unwind-protect
(throw 'notag) ; protected form
(print "an exit")) ; clean up form
; error: no target for THROW
; prints "an exit"
(prog () (print "start")
(unwind-protect
(go end) ; protected form
(print "an exit")) ; clean-up form
end (print "end")) ; prints "start"
; prints "an exit"
; prints "end"
(prog () (print "start")
(unwind-protect
(return "I'm done") ; protected form
(print "but first")) ; clean-up form
(print "won't get here")) ; prints "start"
; prints "but first"
; returns "I'm done"
See the
unwind-protect
special form in the