Data Structures | |
| struct | nxs_exception |
| Structure representing an exception. More... | |
| union | nxs_exception_data |
| Const-safe holder of custom data. More... | |
| struct | nxs_exception_type |
| Structure representing a class of exceptions. More... | |
Defines | |
| #define | nxs_always |
| Begins a block of code that should be executed whether or not an exception is thrown. | |
| #define | nxs_catch(_type, _var) |
| Begins a block of code that will only be executed if an exception of class _type is thrown. | |
| #define | nxs_catch_any(_var) |
| Begins a block of code that will be executed if any exception is thrown. | |
| #define | nxs_catch_only(_type, _var) |
| Begins the only block of code that will only be executed if an exception of class _type is thrown. | |
| #define | nxs_end |
| Performs necessary cleanup to avoid memory leaks from exception handling code. | |
| #define | nxs_exception_assert(_cond) |
| Asserts that the value of _cond does not compare equal to zero. | |
| #define | nxs_exception_declare(_type) |
| Declares (but does not define) an exception class by the name of _type. | |
| #define | nxs_exception_define(_parent, _type) |
| Defines an exception class _type inheriting from _parent. | |
| #define | nxs_exception_define_root(_type) |
| Defines an exception class _type that does not inherit from any other class. | |
| #define | nxs_raise(_type, _data) |
| Raises a new exception of class _type. | |
| #define | nxs_rethrow(_exception) |
| Rethrows the nxs_exception pointed to by _exception. | |
| #define | nxs_throw(_exception) |
| Throws the nxs_exception pointed to by _exception. | |
| #define | nxs_try |
| Begins a block of code that may throw exceptions. | |
Functions | |
| void | nxs_exception_cleanup (void) |
| Releases any resources associated with the exception module. | |
| bool | nxs_exception_init (void) |
Initializes the exception module, returning true on success. | |
| bool | nxs_exception_is (const struct nxs_exception *exception, const struct nxs_exception_type *type) |
| Determines whether exception is of the exception class type, or a subclass thereof. | |
| static void | nxs_exception_print_trace (const struct nxs_exception *exception) |
| Unravels the backtrace of exception, listing all the functions it has passed through. | |
Variables | |
| struct nxs_exception_type *const | NXSAssertionFailureException |
| Thrown when a condition given to nxs_exception_assert() fails. | |
| struct nxs_exception_type *const | NXSMemoryAllocationException |
| Thrown when memory cannot be allocated for internal exception handling data. | |
| struct nxs_exception_type *const | NXSRootException |
| A basic root exception type. | |
NXS_EXCEPTION_THREAD_UNSAFE is defined when compiling this module (i.e. not simply including the header), no attempt will be made to enable thread-safe exceptions. Thread safety is implemented using the Multi-platform threads module (which means that said module must also be compiled into the library or your project), and is only available when NXS_THREAD_HAS_TLS is defined. If NXS_THREAD_HAS_TLS is not defined, including this header will define NXS_EXCEPTION_THREAD_UNSAFE itself. This module must be initialized once with nxs_exception_init(), and nxs_exception_cleanup() should be called before the program exits.
| #define nxs_always |
Begins a block of code that should be executed whether or not an exception is thrown.
Unlike with other exception-handling systems, this block needs to be between the nxs_try and nxs_catch blocks. Functionality is similar to a more traditional finally block except for the positioning.
nxs_try { ... } nxs_always { // perform cleanup actions to prevent resource leaks ... } nxs_catch_any (...) { ... }
break out of a nxs_always block. Exception handling will continue as if execution had left the block normally.A nxs_always block is in a different scope from a nxs_try block. This means variables declared in a nxs_try block cannot be accessed here. Variables declared in a higher scope and merely assigned to will work as intended.
volatile and have been changed inside the nxs_try block are indeterminate if an exception is thrown. This is a restriction imposed by the mechanics of setjmp() and longjmp(). | #define nxs_catch | ( | _type, | |||
| _var | ) |
Begins a block of code that will only be executed if an exception of class _type is thrown.
_var should be a variable to which to assign the nxs_exception pointer.
nxs_try { ... } nxs_catch (NXSAssertionFailureException, nxs_exception *ex) { // perform some action based on the information given in 'ex' ... } nxs_catch_any (...) { ... }
break out of a nxs_catch block. Exception handling will continue as if execution had left the block normally.A nxs_catch block is in a different scope from nxs_try, nxs_always, and other nxs_catch blocks. This means variables declared in any of the aforementioned blocks cannot be accessed here. Variables declared in a higher scope and merely assigned to will work as intended.
return from a nxs_catch block or to exit its scope through the use of goto.
Variables of automatic storage duration local to the containing function that are not qualified with volatile and have been changed inside the nxs_try block are indeterminate. This is a restriction imposed by the mechanics of setjmp() and longjmp().
| #define nxs_catch_any | ( | _var | ) |
Begins a block of code that will be executed if any exception is thrown.
One of this, nxs_catch_only(), or nxs_end must be present in any given exception handler. _var should be a variable to which to assign the nxs_exception pointer.
nxs_try { ... } nxs_catch (NXSAssertionFailureException, nxs_exception *ex) { ... } nxs_catch_any (nxs_exception *ex) { // 'ex' cannot be an NXSAssertionFailureException at this point // now perform some action based on the information given in 'ex' ... }
break out of a nxs_catch_any block. Exception handling will continue as if execution had left the block normally.A nxs_catch_any block is in a different scope from nxs_try, nxs_always, and nxs_catch blocks. This means variables declared in any of the aforementioned blocks cannot be accessed here. Variables declared in a higher scope and merely assigned to will work as intended.
return from a nxs_catch_any block or to exit its scope through the use of goto.
Variables of automatic storage duration local to the containing function that are not qualified with volatile and have been changed inside the nxs_try block are indeterminate. This is a restriction imposed by the mechanics of setjmp() and longjmp().
| #define nxs_catch_only | ( | _type, | |||
| _var | ) |
Begins the only block of code that will only be executed if an exception of class _type is thrown.
This cannot be used with other nxs_catch() blocks. One of this, nxs_catch_any(), or nxs_end must be present in any given exception handler. _var should be a variable to which to assign the nxs_exception pointer.
nxs_try { ... } nxs_catch_only (NXSAssertionFailureException, nxs_exception *ex) { // perform some action based on the information given in 'ex' ... }
break out of a nxs_catch_any block. Exception handling will continue as if execution had left the block normally.A nxs_catch_only block is in a different scope from nxs_try and nxs_always blocks. This means variables declared in either of the aforementioned blocks cannot be accessed here. Variables declared in a higher scope and merely assigned to will work as intended.
return from a nxs_catch_only block or to exit its scope through the use of goto.
Variables of automatic storage duration local to the containing function that are not qualified with volatile and have been changed inside the nxs_try block are indeterminate. This is a restriction imposed by the mechanics of setjmp() and longjmp().
| #define nxs_end |
Performs necessary cleanup to avoid memory leaks from exception handling code.
One of this, nxs_catch_any(), or nxs_catch_only() must be present in any given exception handler.
nxs_try { ... } nxs_catch (NXSAssertionFailureException, nxs_exception *ex) { ... } nxs_end;
| #define nxs_exception_assert | ( | _cond | ) |
Asserts that the value of _cond does not compare equal to zero.
If _cond is zero, an NXSAssertionFailureException is thrown. If NDEBUG is defined, this does nothing and _cond is not evaluted.
| #define nxs_exception_declare | ( | _type | ) |
Declares (but does not define) an exception class by the name of _type.
Intended to be used in header files.
| #define nxs_exception_define | ( | _parent, | |||
| _type | ) |
Defines an exception class _type inheriting from _parent.
Intended to be used in source files.
| #define nxs_exception_define_root | ( | _type | ) |
Defines an exception class _type that does not inherit from any other class.
Intended to be used in source files.
| #define nxs_raise | ( | _type, | |||
| _data | ) |
Raises a new exception of class _type.
If _data is not NULL, it is included with the exception for later handling.
| #define nxs_rethrow | ( | _exception | ) |
Rethrows the nxs_exception pointed to by _exception.
This should be used instead of nxs_throw() to preserve backtrace information when catching an existing exception.
| #define nxs_throw | ( | _exception | ) |
Throws the nxs_exception pointed to by _exception.
This does not preserve the values of the nxs_exception::func or nxs_exception::line fields, and should only be used with locally-created exceptions.
| #define nxs_try |
Begins a block of code that may throw exceptions.
nxs_try { // code possibly raising exceptions goes here ... } nxs_catch_any (...) { ... }
break out of a nxs_try block before any exceptions are thrown. Naturally, this will skip any exception handling.return from a nxs_try block or to exit its scope through the use of goto.
| void nxs_exception_cleanup | ( | void | ) |
Releases any resources associated with the exception module.
This should be called after all exception handling has finished, and when no more exceptions will be thrown.
atexit().| bool nxs_exception_init | ( | void | ) |
Initializes the exception module, returning true on success.
This should be called before any exception handlers are entered or any exceptions are thrown.
| bool nxs_exception_is | ( | const struct nxs_exception * | exception, | |
| const struct nxs_exception_type * | type | |||
| ) |
Determines whether exception is of the exception class type, or a subclass thereof.
| static void nxs_exception_print_trace | ( | const struct nxs_exception * | exception | ) | [inline, static] |
Unravels the backtrace of exception, listing all the functions it has passed through.
| struct nxs_exception_type* const NXSAssertionFailureException |
Thrown when a condition given to nxs_exception_assert() fails.
Inherits from NXSRootException.
| struct nxs_exception_type* const NXSMemoryAllocationException |
Thrown when memory cannot be allocated for internal exception handling data.
Inherits from NXSRootException.
| struct nxs_exception_type* const NXSRootException |
A basic root exception type.
This will not get thrown by NXS Toolkit code; however, a subtype may be.
1.5.4