Next: iklib syntaxes splice1st, Previous: iklib syntaxes body, Up: iklib syntaxes [Index]
try
, catch
, finally
syntaxesThe syntax try
can be used to handle raised exceptions in
addition to the R6RS–defined syntaxes with-exception-handler
and guard
. The syntax is basically a wrapper for guard
from (rnrs exceptions (6))
(see guard).
Evaluate the form ?body and return its results. If no exceptions are raised by ?body: before returning evaluate the ?finally-clause. If an exception is raised by ?body: handle it with the ?catch-clauses and, before returning, evaluate the ?finally-clause.
The ?catch-clauses argument must have the format:
(catch ?var ?catch-clause0 ?catch-clause ...)
where ?var must be an identifier and every ?catch-clause has one of the forms:
(?pred ?tag-body0 ?tag-body ...) (else ?else-body0 ?else-body ...)
where the optional else
clause must appear only once as last
one. The ?pred argument must have one of the following recursive
formats:
?pred = (?tag) | (and ?inner-pred0 ?inner-pred ...) | (or ?inner-pred0 ?inner-pred ...) | (xor ?inner-pred0 ?inner-pred ...) | (not ?inner-pred) ?inner-pred = ?tag | (and ?inner-pred0 ?inner-pred ...) | (or ?inner-pred0 ?inner-pred ...) | (xor ?inner-pred0 ?inner-pred ...) | (not ?inner-pred)
where: ?tag is a condition object type identifier; and
,
or
, xor
, not
are the identifiers exported by
(vicare)
.
The ?finally-clause must have the format:
(finally ?finally-body0 ?finally-body ...)
when the finally
clause is present: the ?body is wrapped
into an unwind–protection syntax, See The
unwind-protection mechanism.
The following expansions take place:
(try ?body (catch ?var ((?tag) ?tag-body0 ?tag-body ...) ...)) → (guard (?var ((is-a? ?var) ?tag-body0 ?tag-body ...) ...) ?body)
(try ?body (catch ?var ((?tag) ?tag-body0 ?tag-body ...) ...) (else ?else-body0 ?else-body ...)) → (guard (?var ((is-a? ?var ?tag0) ?tag-body0 ?tag-body ...) ... (else ?else-body0 ?else-body ...)) ?body)
(try ?body (catch ?var ((?tag) ?tag-body0 ?tag-body ...) ...) (finally ?finally-body0 ?finally-body ...)) → (with-unwind-protection (lambda (dummy) ?finally-body0 ?finally-body ...) (lambda () (guard (?var ((is-a? ?var ?tag0) ?tag-body0 ?tag-body ...) ...) ?body)))
(try ?body (finally ?finally-body0 ?finally-body ...)) → (with-unwind-protection (lambda (dummy) ?finally-body0 ?finally-body ...) (lambda () ?body))
Some usage examples without the finally
clause:
(import (vicare)) (define-condition-type &this &error make-this-condition condition-this? (a condition-this.a) (b condition-this.b) (c condition-this.c)) (define (doit thunk) (try (thunk) (catch E ((&this) (list (condition-this.a E) (condition-this.b E) (condition-this.c E))) ((&message) (condition-message E)) (else E)))) (doit (lambda () (raise (make-this-condition 1 2 3)))) ⇒ (1 2 3) (doit (lambda () (raise (make-message-condition "ciao")))) ⇒ "ciao" (doit (lambda () (raise 123))) ⇒ 123
Evaluation order tracking for finally
clauses:
(with-result (try (add-result 'body) (catch E ((&error) (add-result 'catch-error)) ((&warning) (add-result 'catch-warning)) (else (add-result 'catch-else))) (finally (add-result 'finally)))) ⇒ (body (body finally)) (with-result (try (begin (add-result 'body) (raise (make-warning))) (catch E ((&error) (add-result 'catch-error)) ((&warning) (add-result 'catch-warning)) (else (add-result 'catch-else))) (finally (add-result 'finally)))) ⇒ (catch-warning (body catch-warning finally))
Next: iklib syntaxes splice1st, Previous: iklib syntaxes body, Up: iklib syntaxes [Index]