std::uncaught_exception, std::uncaught_exceptions
Defined in header <exception>
|
||
bool uncaught_exception(); |
(1) | (deprecated in C++17) |
int uncaught_exceptions(); |
(2) | (since C++17) |
std::uncaught_exception
detects if stack unwinding is currently in progress.Sometimes it's safe to throw an exception even while std::uncaught_exception() == true. For example, if stack unwinding causes a stack-allocated object to be destructed, the destructor for that object could run code that throws an exception as long as the exception is caught by some catch block before escaping the destructor.
Parameters
(none)
Return value
Exceptions
(none) | (until C++11) |
noexcept specification: noexcept |
(since C++11) |
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() throws (in which case the number of uncaught exceptions in the destructor is greater than what the constructor observed)
Example
#include <iostream> #include <exception> #include <stdexcept> struct Foo { ~Foo() { if (std::uncaught_exception()) { std::cout << "~Foo() called during stack unwinding\n"; } else { std::cout << "~Foo() called normally\n"; } } }; int main() { Foo f; try { Foo f; std::cout << "Exception thrown\n"; throw std::runtime_error("test exception"); } catch (const std::exception& e) { std::cout << "Exception caught: " << e.what() << '\n'; } }
Output:
Exception thrown ~Foo() called during stack unwinding Exception caught: test exception ~Foo() called normally
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) |