std::uncaught_exception, std::uncaught_exceptions
Defined in header <exception>
|
||
(1) | ||
bool uncaught_exception(
)
throw
(
)
;
|
(until C++11) | |
bool uncaught_exception() noexcept; |
(since C++11) (deprecated in C++17) (removed in C++20) |
|
int uncaught_exceptions() noexcept;
|
(2) | (since C++17) (constexpr since C++26) |
std::uncaught_exception
detects if stack unwinding
Sometimes it's safe to throw an exception even while std::uncaught_exception() == true (until C++17) std::uncaught_exceptions() > 0 (since C++17) . For example, if stack unwinding
Parameters
(none)
Return value
Notes
An example where int-returning uncaught_exceptions
is used is the boost.log library: the expression
BOOST_LOG(logger) << foo();
first creates a guard object and records the number of uncaught exceptions in its constructor. The output is performed by the guard object's destructor unless foo()
std::experimental::scope_fail and std::experimental::scope_success in LFTS v3 rely on the functionality of uncaught_exceptions
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_uncaught_exceptions |
201411L |
(C++17) | std::uncaught_exceptions
|
__cpp_lib_constexpr_exceptions |
202411L |
(C++26) | constexpr for exception types |
Example
#include <exception> #include <iostream> #include <stdexcept> struct Foo { char id{'?'}; int count = std::uncaught_exceptions(); ~Foo() { count == std::uncaught_exceptions() ? std::cout << id << ".~Foo() called normally\n" : std::cout << id << ".~Foo() called during stack unwinding\n"; } }; int main() { Foo f{'f'}; try { Foo g{'g'}; std::cout << "Exception thrown\n"; throw std::runtime_error("test exception"); } catch (const std::exception& e) { std::cout << "Exception caught: " << e.what() << '\n'; } }
Possible output:
Exception thrown g.~Foo() called during stack unwinding Exception caught: test exception f.~Foo() called normally
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 70 | C++98 | the exception specification of uncaught_exception() was missing
|
specified as throw()
|
See also
function called when exception handling fails (function) |
|
(C++11)
|
shared pointer type for handling exception objects (typedef) |
(C++11)
|
captures the current exception in a std::exception_ptr (function) |
External links
1. | GOTW issue 47: Uncaught Exceptions |
2. | Rationale for std::uncaught_exceptions (N4125)
|