/** @page exception_handling Exception Handling

    @tableofcontents

    Exceptions are errors that can only be handled using a @ref try "try catch block". Any exception that is thrown in
    a @ref try "try block" will immediately cause execution of that thread to begin with the first statement of the
    @ref try "catch block", regardless of the position of the program pointer of the running thread, even if nested
    function or object method calls have been made.

    Exceptions can be thrown by the %Qore system for a number of reasons, see the documentation for each function and
    object method for details.

    Programmers can also throw exceptions explicitly by using the @ref throw "throw" and @ref rethrow "rethrow"
    statements.

    Information about the exception, including the context in which the exception occurred, is saved in the exception
    hash, which can be retrieved by using a parameter variable in the @ref try "catch block".

    The exception hash is defined in the @ref Qore::ExceptionInfo "ExceptionInfo" @ref hashdecl "hashdecl".

    System exceptions always throw at least 2 values, populating the \c "err" and \c "desc" keys of the exception hash,
    giving the exception string code and the exception description string, respectively, and occassionally, depending
    on the function, the \c "arg" key may be populated with supporting information. User exceptions have no
    restrictions, any values given in the @ref throw "throw statement" will be mapped to exception keys as per the
    table above.

    See the @ref on_exit "on_exit", @ref on_success "on_success" statement, and @ref on_error "on_error" statement for
    statements that allow for exception-safe and exception-dependent cleanup in %Qore code.

    Classes that assist in exception-safe lock handling are the @ref Qore::Thread::AutoLock "AutoLock class", the
    @ref Qore::Thread::AutoGate "AutoGate class", the @ref Qore::Thread::AutoReadLock "AutoReadLock class", and the
    @ref Qore::Thread::AutoWriteLock "AutoWriteLock class".

    @note A maximum limit of 20 exceptions can be raised at any time; excess exceptions over this limit will be
    ignored.
*/
