10.4 Exceptions

The module Exception provides procedures to construct exceptions and raise them.

Special Exceptions

Any value may be raised as exception, although commonly only records are used. Some of these serve special purposes: error exceptions are records with label error. These are raised when a programming error occurs; it is not recommended to catch these. System exceptions are records with label system. These are raised when an unforeseeable runtime condition occurs; a file operations library might raise system exceptions when a file cannot be opened. It is recommended to always handle such exceptions. Failure exceptions are records with label failure; these are raised when a tell operation fails.

Dispatch Fields

Both error and system exceptions have a dispatch field. This is the subtree at feature 1 of the exception record. This is usually a record further describing the exact condition that occurred.

Debug Information

If an exception is a record and has a feature debug with value unit, then the implementation may replace (depending on the value of the property ozconf.errorDebug) the corresponding subtree by implementation-dependent debugging information. This is to be printed out in the case of uncaught exceptions.

All procedures in the Base Environment only ever raise special-purpose exceptions as described above.

error

{Exception.error X ?Y}

returns an error exception record with dispatch field X.

system

{Exception.system X ?Y}

returns a system exception record with dispatch field X.

failure

{Exception.failure X ?Y}

returns a failure exception. The value X may give a hint on why failure occurred; implementations may store this inside the constructed exception's debug field.

Raise

{Exception.'raise' X}

raises X as an exception.

raiseError

{Exception.raiseError X}

wraps X into an error exception and raises this. This procedure can be defined as follows, except that it always add debug informations:

proc {Exception.raiseError X}
   {Exception.'raise' {AdjoinAt {Exception.error X} debug unit}}
end


Denys Duchier, Leif Kornstaedt and Christian Schulte
Version 1.4.0 (20080702)