Error handling is based on
throw. Errors are
always thrown with a key and four arguments:
~Scan be embedded within the message: they will be replaced with members of the args list when the message is printed.
~Aindicates an argument printed using
~Sindicates 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).
~Stokens in message. Can also be
#fif no arguments are required.
'system-error, this contains the C errno value. Can also be
#fif no additional objects are required.
In addition to
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
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
the rest argument. For
scm_syserror the message is
Care should be taken that any code in between the failing operation
and the call to these routines doesn’t change
Throw an error with the various keys described above.
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.
scm_wrong_type_arg_msg, expected is a C string
describing the type of argument that was expected.
scm_misc_error, message is the error message string,
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.
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
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.