include "exception.m"; exc := load Exception Exception->PATH; NOTIFYLEADER, PROPAGATE: con iota; getexc: fn(pid: int): (int, string, string); setexcmode: fn(mode: int): int;
When a process incurs an exception, the system saves details before processing the exception, following Limbo's rules. Getexc returns a tuple (pc, module, description) that describes the most recent exception raised in process pid. (A process id of -1 is taken to mean the current process.) The tuple contains the pc value, the module name, and the exception name. The value (0, nil, nil) is returned if no exception has occurred.
By default, when a process incurs an exception that is not handled — no exception clause matches that exception — the process is stopped in a `Broken' state for debugging, and the exception does not propagate further. Setexcmode changes the way that the system handles exceptions for the current process and those it later spawns. A mode of NOTIFYLEADER makes the invoking process the leader of the current process group for exception handling. Subsequently, an exception in any process in the current process group will atomically destroy all processes in the group except the leader, and the exception will be raised in the leader. (This works even when the leader itself incurs the exception.) A mode of PROPAGATE instead causes an exception in any process in the group to be raised in all processes in the group, allowing them all to initiate local error recovery (ie, within each process).
|EXCEPTION(2 )||Rev: Tue Mar 31 02:42:39 GMT 2015|