15 Exception handling [except]

15.5 Special functions [except.special]

The function std::terminate() ([except.terminate]) is used by the exception handling mechanism for coping with errors related to the exception handling mechanism itself. The function std::current_exception() ([propagation]) and the class std::nested_exception ([except.nested]) can be used by a program to capture the currently handled exception.

15.5.1 The std::terminate() function [except.terminate]

In some situations exception handling must be abandoned for less subtle error handling techniques. [ Note: These situations are:

 — end note ]

In such cases, std::terminate() is called ([exception.terminate]). In the situation where no matching handler is found, it is implementation-defined whether or not the stack is unwound before std::terminate() is called. In the situation where the search for a handler ([except.handle]) encounters the outermost block of a function with a non-throwing exception specification ([except.spec]), it is implementation-defined whether the stack is unwound, unwound partially, or not unwound at all before std::terminate() is called. In all other situations, the stack shall not be unwound before std::terminate() is called. An implementation is not permitted to finish stack unwinding prematurely based on a determination that the unwind process will eventually cause a call to std::terminate().

15.5.2 The std::uncaught_exceptions() function [except.uncaught]

An exception is considered uncaught after completing the initialization of the exception object ([except.throw]) until completing the activation of a handler for the exception ([except.handle]). This includes stack unwinding. If an exception is rethrown ([expr.throw], [propagation]), it is considered uncaught from the point of rethrow until the rethrown exception is caught. The function std::uncaught_exceptions() ([uncaught.exceptions]) returns the number of uncaught exceptions in the current thread.