Scheme 48 Manual | Contents | In Chapter: Mixing Scheme 48 and C
Previous: Raising exceptions from external code | Next: Raising exceptions from external code

## Raising exceptions from external code

The following macros explicitly raise certain errors, immediately returning to Scheme 48. Raising an exception performs all necessary clean-up actions to properly return to Scheme 48, including adjusting the stack of protected variables.

- `s48_raise_scheme_exception(int type, int nargs, ...)`

`s48_raise_scheme_exception` is the base procedure for raising exceptions. `type` is the type of exception, and should be one of the `S48_EXCEPTION_`...constants defined in `scheme48arch.h`. `nargs` is the number of additional values to be included in the exception; these follow the `nargs` argument and should all have type `s48_value`. `s48_raise_scheme_exception` never returns.

The following procedures are available for raising particular types of exceptions. Like `s48_raise_scheme_exception` these never return.

- `s48_raise_argument_type_error(s48_value)`
- `s48_raise_argument_number_error(int nargs, int min, int max)`
- `s48_raise_range_error(long value, long min, long max)`
- `s48_raise_closed_channel_error()`
- `s48_raise_os_error(int errno)`
- `s48_raise_out_of_memory_error()`

An argument type error indicates that the given value is of the wrong type. An argument number error is raised when the number of arguments, `nargs`, should be, but isn't, between `min` and `max`, inclusive. Similarly, a range error indicates that `value` is not between between `min` and `max`, inclusive.

The following macros raise argument type errors if their argument does not have the required type. `S48_CHECK_BOOLEAN` raises an error if its argument is neither `#t` or `#f`.

- `void S48_CHECK_BOOLEAN(s48_value)`
- `void S48_CHECK_SYMBOL(s48_value)`
- `void S48_CHECK_PAIR(s48_value)`
- `void S48_CHECK_STRING(s48_value)`
- `void S48_CHECK_INTEGER(s48_value)`
- `void S48_CHECK_CHANNEL(s48_value)`
- `void S48_CHECK_BYTE_VECTOR(s48_value)`
- `void S48_CHECK_RECORD(s48_value)`
- `void S48_CHECK_SHARED_BINDING(s48_value)`

Previous: Raising exceptions from external code | Next: Raising exceptions from external code