[ Control | The ECLiPSe Built-In Predicates | Reference Manual | Alphabetic Index ]

# exit_block(++TagExit)

Continues the program at the recovery procedure of the block/3 predicate whose Tag argument unifies with TagExit.

TagExit
  An atom, integer or handle.

## Description

Can only occur after block(Goal,Tag, Recovery) has been invoked. First Goal is called and if this succeeds then block/3 succeeds. If Goal fails then so does the call of block/3. If, however, during the execution of Goal there is a call of exit_block(TagExit) such that Tag unifies with TagExit, then block/3 calls the goal Recovery, and succeeds or fails according to whether Recovery succeeds or fails. If Tag does not unify with TagExit, the system continues looking for an earlier invocation of block/3.

If no block/3 catches the exit, then control will either return to the host program (in case of an embedded ECLiPSe) or the ECLiPSe process will exit (in case of a standalone ECLiPSe).

### Modes and Determinism

- exit_block(++) is erroneous

### Exceptions

(4) instantiation fault
  TagExit is uninstantiated.
(5) type error
  TagExit is instantiated but not to an atom, integer or handle.
(230) uncaught exception
  TagExit does not unify with a Tag of any uncompleted call of block/3.

## Examples

          % A variable Tag catches all exit_blocks
          ?- block(exit_block(hello), T, writeln(recover(T))).
          recover(hello)
          T = hello
          Yes (0.00s cpu)

          % An instantiated Tag catches only matching exit_blocks
          ?- block(exit_block(hello), hello, writeln(recovered)).
          recovered
          Yes (0.00s cpu)

          ?- block(exit_block(hello), world, writeln(recovered)).
          uncaught exception in exit_block(hello)
          Abort

    Error:
          exit_block("a").                (Error 5).
          exit_block(a).                  (Error 230).

## See Also

block / 3