std::current_exception(3)
okay so bestie π this is std::current_exception, straight outta the C++ Standard Libary manual, and she's literally the hold my exception queen. Let's get into it β¨
πΈ NAME πΈ
std::current_exception β std::current_exception. That's the whole name, she's not doing too much π
π¦ Synopsis π¦
Defined in header <exception>:
std::exception_ptr current_exception() noexcept;
The way this one's been around since C++11 β¨
okay so here's the tea, bestie: if called during exception handling (typically, in a catch clause), std::current_exception captures the current exception object and creates an std::exception_ptr that holds either a copy or a reference to that exception object (depending on the implementation). The referenced object remains valid at least as long as there is an exception_ptr object that refers to it. Longevity icon behavior, no cap π
If the implementation of this function requires a call to new and the call fails, the returned pointer will hold a reference to an instance of std::bad_alloc. π not the allocation fail
If the implementation of this function requires copying the captured exception object and its copy constructor throws an exception, the returned pointer will hold a reference to the exception thrown. If the copy constructor of the thrown exception object also throws, the returned pointer may hold a reference to an instance of std::bad_exception to break the endless loop. The endless loop said not today π
If the function is called when no exception is being handled, an empty std::exception_ptr is returned. No exception, no problem π«Ά
This function can be called in a std::terminate_handler to retrieve the exception which has provoked the invocation of std::terminate. Main character energy in the terminate handler, honestly π
π Parameters π
(none) β she takes no arguments. Zero. Zilch. Low-maintenance queen π§
π Return value π
An instance of std::exception_ptr holding a reference to the exception object, or a copy of the exception object, or to an instance of std::bad_alloc or to an instance of std::bad_exception. It's giving little smart-pointer bouquet of possibilities π
π₯ Notes π₯
On the implementations that follow Itanium C++ ABI (GCC, Clang, etc), exceptions are allocated on the heap when thrown (except for std::bad_alloc in some cases), and this function simply creates the smart pointer referencing the previously-allocated object. On MSVC, exceptions are allocated on stack when thrown, and this function performs the heap allocation and copies the exception object. Different vibes, same API β¨
On Windows in managed CLR environments [1], the implementation will store a std::bad_exception when the current exception is a managed exception ([2]). Note that catch(...) catches also managed exceptions:
#include <exception>
int main()
{
try
{
throw gcnew System::Exception("Managed exception");
}
catch (...)
{
std::exception_ptr ex = std::current_exception();
try
{
std::rethrow_exception(ex);
}
catch (std::bad_exception const &)
{
// This will be printed.
std::cout << "Bad exception" << std::endl;
}
}
}
π Example π
// Run this code β go off, bestie π
#include <exception>
#include <iostream>
#include <stdexcept>
#include <string>
void handle_eptr(std::exception_ptr eptr) // passing by value is ok
{
try
{
if (eptr)
std::rethrow_exception(eptr);
}
catch(const std::exception& e)
{
std::cout << "Caught exception: '" << e.what() << "'\n";
}
}
int main()
{
std::exception_ptr eptr;
try
{
std::string().at(1); // this generates a std::out_of_range
}
catch(...)
{
eptr = std::current_exception(); // capture
}
handle_eptr(eptr);
} // destructor for std::out_of_range called here, when the eptr is destructed
πΈ Possible output πΈ
Caught exception: 'basic_string::at: __n (which is 1) >= this->size() (which is 0)'
π See also π
exception_ptrβ shared pointer type for handling exception objects (C++11) (typedef)rethrow_exceptionβ throws the exception from anstd::exception_ptr(C++11) (function)make_exception_ptrβ creates anstd::exception_ptrfrom an exception object (C++11) (function template)uncaught_exceptionβ checks if exception handling is currently in progress (removed in C++20) (function)uncaught_exceptionsβ checks if exception handling is currently in progress (C++17) (function)
mwah π that's the whole page, served fresh from http://cppreference.com on 2024.06.10, and yes bestie, she's still std::current_exception(3). bye π«Ά
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms