<< Prev | - Up - | Next >> |
Raising Exceptions
In line 10 the program simply returns OZ_FAILED
if the environment variable is not defined, which is not good programming style. It should better raise an exception. This can be done using
OZ_Return OZ_raise(OZ_Term t);
which raises the exception t
. In our example we should replace line 10 with something like
return OZ_raise(OZ_atom("envVarNotDefined"));
We leave as an exercise to the reader to give more informative exception, e. g. adding the name of the undefined variable.
Raising type errors
Furthermore an extra function is provided for raising type errors. The macro OZ_declareAtom
used in our example makes use of this function. Type errors can be signaled using
OZ_Return OZ_typeError(int pos, char *expectedType);
This is an exception signaling that the argument at position pos
is incorrect and the name of the expected type is expectedType
.
Suspension of C functions
The macro OZ_declareAtom
internally also makes use of facilities that allow C functions to suspend the running thread on variables. Thus OZ_declareAtom
uses some code of the following form:
if (OZ_isVariable(envVarName)) {
OZ_suspendOn(envVarName);
}
If envVarName
is an unconstrained variable then OZ_suspendOn
is called. OZ_suspendOn
is a macro that takes a variable as argument and suspends the current thread. If the variable is determined the suspended thread becomes runnable in which case it will reexecute the C function from the beginning.
The application
declare X in {Browse {Goodies.getenv X}}
will call the C function as above. But the first argument is detected as variable and the executing thread suspends.
If we feed
X='HOME'
the C function BIgetenv
is called again from the beginning and the browser updates the display of the value of the environment variable as expected.
<< Prev | - Up - | Next >> |