Go to the first, previous, next, last section, table of contents.


bind

bind_expression:
          bind `(' handlers `)' expression
        ;

handlers:
          handler [`;' handlers]
        ;

A bind_expression sets one or more handlers for any conditions which are raised or signaled during the evaluation of the expression. The value returned from the bind is the value returned by the expression.

handler:
          `(' condition `,' expression `)'
        ;

condition:
          expression
        ;

Each handler is an expression which will be invoked if the condition, or a sub condition thereof, is raised (or signaled). The condition normally is an instance of tom.Condition.

Implicitly declared in the context of the handler expression is a local variable Condition condition; it is the condition being raised.

A useful thing to do for a handler is to perform a throw to force a non-local exit out of the exceptional state. Note, however, that the handler is invoked in the context of the condition raiser. This implies that in the following expression

catch (self)
  bind ((error, {[self throw void]; nil;}))
    {
      do_something_difficult;
    }

the throw need not immediately return from this catch since another catch of the same object self could have been set (and active) during the invocation of do_something_difficult.

A handler does not need to handle the condition by performing a non-local exit. If the handler does not wish to handle it, the value returned by the handler should be the condition object it was passed. If the handler returns any other value, which must always be an object, the handler considers the condition to have been handled. If the condition was signaled, the value returned by the handler is returned from the signal. If the condition was raised, the return value is ignored and the condition mechanism continues as if the handler had not handled the condition.


Go to the first, previous, next, last section, table of contents.