next up previous index
Next: Collections Up: Control structures Previous: Looping and closures   Index

Exception handling

In error.diesel:

extend module Stdlib;
module Error;
The handle_system_errors function executes its argument closure. Any Diesel ``system errors'' (e.g., error or exit calls) caused during evaluation of the closure are caught and suppressed (after the trap into the debugger returns). The boolean return value indicates whether an error was suppressed.

fun handle_system_errors(cl:&():void):bool;

The unwind_protect function allows a ``clean up'' closure to be executed whenever control returns through the unwind_protect function call, either normally, via a non-local return, or via a Diesel ``system error.'' unwind_protect first invokes its cl closure argument. When control returns from this invocation, the on_return closure is invoked. If the on_return closure returns normally, the returning of the cl closure is resumed: if the cl closure returned normally, the result of this closure is returned normally as the result of the unwind_protect function; otherwise it continues to throw whatever exception or system error the body did. If the on_return closure returns abnormally, either via a non-local return or a system error, then this result supercedes the original suspended result of the cl closure. (unwind_protect is similar to the like-named construct in Common Lisp.)

fun unwind_protect(cl:&():`T, on_return:&():void):T;

The on_error function allows a ``clean up'' closure to be executed whenever control returns through the on_error function call abnormally, either via a non-local return or via a Diesel ``system error.'' on_error first invokes its cl closure argument. If control returns normally from cl, then on_error returns normally the result of this closure, without invoking its on_error closure. If, on the other hand, control returns from cl either via a non-local return or a system error, the on_error closure is invoked. If this closure completes normally, the abnormal returning of the cl closure is resumed (either continuing the non-local return or the system error raised by cl). If the on_error closure returns abnormally, either via a non-local return or a system error, then this result supercedes the original suspended abnormal result of the cl closure. on_error is like unwind_protect, except that the on_error block is only run if the cl block has an abnormal result.

fun on_error(cl:&():`T, on_error:&():void):T;
end module Error;


next up previous index
Next: Collections Up: Control structures Previous: Looping and closures   Index

Cecil/Vortex Project