Next: restarts assoc, Previous: restarts handler-bind, Up: restarts [Index]
Install restart handlers in the current dynamic environment, then evaluate the body form.
The arguments ?clause must have the following syntax:
(?restart-name ?restart-handler)
Every ?restart-name must be a symbol representing the name of a
restart; the same ?restart-name can be used in nested uses of
restart-case
.
Every ?restart-handler must be an expression evaluating to a
procedure accepting a non–constrained number of arguments. The return
values of ?restart-handler become the return values of
restart-case
. The ?restart-handler is evaluated in the
dynamic environment of the call to invoke-restart
that invoked
the restart.
As special case, if ?body is:
(signal ?expr)
the installed restarts are associated to the condition object returned by the evaluation of ?expr.
Usage examples on restarts and declining handlers:
(import (vicare) (only (vicare checks) with-result add-result)) ;;No handlers installed. Signal a condition and ;;cause SIGNAL to return. ;; (with-result (with-return-to-signal-on-unhandled-exception (add-result 'body-in) (signal (make-error)) (add-result 'body-out) 1)) ⇒ (1 (body-in body-out)) ;;No handlers installed. Raise an exception with the ;;standard RAISE and show that it goes through the ;;"return to signal" syntax. ;; (with-result (try (with-return-to-signal-on-unhandled-exception (add-result 'body-in) (raise (make-error)) (add-result 'body-out) 1) (catch E ((&error) (add-result 'catch-error) 2)))) ⇒ (2 (body-in catch-error)) ;;No handlers installed. Raise an exception with the ;;standard RAISE-CONTINUABLE and show that it goes ;;through the "return to signal" syntax. ;; (with-result (try (with-return-to-signal-on-unhandled-exception (add-result 'body-in) (raise-continuable (make-error)) (add-result 'body-out) 1) (catch E ((&error) (add-result 'catch-error) 2)))) ⇒ (2 (body-in catch-error)) ;;No handlers installed. Raise an exception with the ;;standard RAISE-CONTINUABLE and show that it goes ;;through the "return to signal" syntax. ;; (with-result (with-exception-handler (lambda (E) (add-result 'exception-handler)) (lambda () (with-return-to-signal-on-unhandled-exception (add-result 'body-in) (raise-continuable (make-error)) (add-result 'body-out) 1)))) ⇒ (1 (body-in exception-handler body-out)) ;;; ;;Nested RESTART-CASE and HANDLER-BIND. Signal a condition, ;;call the first handler, the first handler declines, call ;;the second handler, the second handler declines, SIGNAL ;;returns. ;; (with-result (with-return-to-signal-on-unhandled-exception (handler-bind ((&error (lambda (E) (add-result 'outer-error-handler)))) (handler-bind ((&error (lambda (E) (add-result 'inner-error-handler)))) (add-result 'body-in) (signal (make-error)) (add-result 'body-out) 1)))) ⇒ (1 (body-in inner-error-handler outer-error-handler body-out))
Usage examples on the unwind–protection mechanism:
(import (vicare) (only (vicare checks) with-result add-result)) (with-result (restart-case (with-unwind-handler (lambda (why) (add-result 'unwind-handler)) (lambda () (add-result 'body-enter) (invoke-restart 'alpha) (add-result 'body-return))) (alpha (lambda () (add-result 'restart-alpha) 1)))) ⇒ (1 (body-enter restart-alpha unwind-handler)) (internal-body (define (doit C) (with-result (returnable (handler-bind ((&error (lambda (E) (add-result 'error-handler) (return 1)))) (with-unwind-handler (lambda (why) (add-result 'outer-unwind-handler)) (lambda () (handler-bind ((&warning (lambda (E) (add-result 'warning-handler) (return 2)))) (with-unwind-handler (lambda (why) (add-result 'inner-unwind-handler)) (lambda () (add-result 'body-begin) (signal C) (add-result 'body-normal-return)))))))))) (doit (make-error)) ⇒ (1 (body-begin error-handler inner-unwind-handler outer-unwind-handler)) (doit (make-warning)) ⇒ (2 (body-begin warning-handler inner-unwind-handler outer-unwind-handler)) #| end of body |# )
Next: restarts assoc, Previous: restarts handler-bind, Up: restarts [Index]