Next: Continuation Barriers, Previous: Parameters, Up: Control Mechanisms [Contents][Index]
Guile is currently in a transition from its historical catch
and
throw
error handling and signaling operators to the new
structured exception facility; See Exceptions. However in the
meantime, here is some documentation on errors and the older
catch
and throw
interface.
Errors are always thrown with a key and four arguments:
#f
.
~A
and ~S
can be
embedded within the message: they will be replaced with members of the
args list when the message is printed. ~A
indicates an
argument printed using display
, while ~S
indicates an
argument printed using write
. message can also be
#f
, to allow it to be derived from the key by the error
handler (may be useful if the key is to be thrown from both C and
Scheme).
~A
and
~S
tokens in message. Can also be #f
if no
arguments are required.
'system-error
, this contains the C errno value. Can also
be #f
if no additional objects are required.
In addition to catch
and throw
, the following Scheme
facilities are available:
Display an error message to the output port port. frame is the frame in which the error occurred, subr is the name of the procedure in which the error occurred and message is the actual error message, which may contain formatting instructions. These will format the arguments in the list args accordingly. rest is currently ignored.
The following are the error keys defined by libguile and the situations in which they are used:
error-signal
: thrown after receiving an unhandled fatal signal
such as SIGSEGV, SIGBUS, SIGFPE etc. The rest argument in the throw
contains the coded signal number (at present this is not the same as the
usual Unix signal number).
system-error
: thrown after the operating system indicates an
error condition. The rest argument in the throw contains the
errno value.
numerical-overflow
: numerical overflow.
out-of-range
: the arguments to a procedure do not fall within the
accepted domain.
wrong-type-arg
: an argument to a procedure has the wrong type.
wrong-number-of-args
: a procedure was called with the wrong number
of arguments.
memory-allocation-error
: memory allocation error.
stack-overflow
: stack overflow error.
regular-expression-syntax
: errors generated by the regular
expression library.
misc-error
: other errors.
In the following C functions, SUBR and MESSAGE parameters
can be NULL
to give the effect of #f
described above.
Throw an error, as per scm-error
(see Error Reporting).
Throw an error with key system-error
and supply errno
in
the rest argument. For scm_syserror
the message is
generated using strerror
.
Care should be taken that any code in between the failing operation
and the call to these routines doesn’t change errno
.
Throw an error with the various keys described above.
In scm_wrong_num_args
, proc should be a Scheme symbol
which is the name of the procedure incorrectly invoked. The other
routines take the name of the invoked procedure as a C string.
In scm_wrong_type_arg_msg
, expected is a C string
describing the type of argument that was expected.
In scm_misc_error
, message is the error message string,
possibly containing simple-format
escapes (see Simple Output), and the corresponding arguments in the args list.
Every function visible at the Scheme level should aggressively check the types of its arguments, to avoid misinterpreting a value, and perhaps causing a segmentation fault. Guile provides some macros to make this easier.
If test is zero, signal a “wrong type argument” error, attributed to the subroutine named subr, operating on the value obj, which is the position’th argument of subr.
In SCM_ASSERT_TYPE
, expected is a C string describing the
type of argument that was expected.
One of the above values can be used for position to indicate the
number of the argument of subr which is being checked.
Alternatively, a positive integer number can be used, which allows to
check arguments after the seventh. However, for parameter numbers up to
seven it is preferable to use SCM_ARGN
instead of the
corresponding raw number, since it will make the code easier to
understand.
Passing a value of zero or SCM_ARGn
for position allows to
leave it unspecified which argument’s type is incorrect. Again,
SCM_ARGn
should be preferred over a raw zero constant.
Next: Continuation Barriers, Previous: Parameters, Up: Control Mechanisms [Contents][Index]