Namespaces
Variants

std:: current_exception

From es.cppreference.net
Definido en el encabezado <exception>
std:: exception_ptr current_exception ( ) noexcept ;
(desde C++11)
(constexpr desde C++26)

Si se llama durante el manejo de excepciones (típicamente, en una cláusula catch ), captura el objeto de excepción actual y crea un std::exception_ptr que contiene una copia o una referencia a ese objeto de excepción (dependiendo de la implementación). El objeto referenciado permanece válido al menos mientras exista un objeto exception_ptr que haga referencia al mismo.

Si la implementación de esta función requiere una llamada a new y la llamada falla, el puntero devuelto contendrá una referencia a una instancia de std::bad_alloc .

Si la implementación de esta función requiere copiar el objeto de excepción capturado y su constructor de copia lanza una excepción, el puntero devuelto contendrá una referencia a la excepción lanzada. Si el constructor de copia del objeto de excepción lanzado también lanza, el puntero devuelto puede contener una referencia a una instancia de std::bad_exception para romper el bucle infinito.

Si la función es llamada cuando no se está manejando ninguna excepción, se retorna un std::exception_ptr vacío.

Esta función puede ser llamada en un std::terminate_handler para recuperar la excepción que ha provocado la invocación de std::terminate .

Contenidos

Valor de retorno

Una instancia de std::exception_ptr que contiene una referencia al objeto de excepción, o una copia del objeto de excepción, o a una instancia de std::bad_alloc o a una instancia de std::bad_exception .

Notas

En las implementaciones que siguen Itanium C++ ABI (GCC, Clang, etc), las excepciones se asignan en el montículo cuando se lanzan (excepto para std::bad_alloc en algunos casos), y esta función simplemente crea el puntero inteligente que referencia el objeto previamente asignado. En MSVC, las excepciones se asignan en la pila cuando se lanzan, y esta función realiza la asignación en el montículo y copia el objeto de excepción.

En Windows en entornos CLR administrados [1] , la implementación almacenará un std::bad_exception cuando la excepción actual sea una excepción administrada ( [2] ). Nótese que catch ( ... ) también captura excepciones administradas:

#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 &)
        {
            // Esto será impreso.
            std::cout << "Bad exception" << std::endl;
        }
    }
}
Macro de prueba de características Valor Std Característica
__cpp_lib_constexpr_exceptions 202411L (C++26) constexpr para tipos de excepción

Ejemplo

#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
    {
        [[maybe_unused]]
        char ch = 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

Salida posible:

Caught exception: 'basic_string::at: __n (which is 1) >= this->size() (which is 0)'

Véase también

tipo de puntero compartido para manejar objetos de excepción
(typedef)
lanza la excepción desde un std::exception_ptr
(función)
crea un std::exception_ptr desde un objeto de excepción
(plantilla de función)
( eliminado en C++20* ) (C++17)
verifica si el manejo de excepciones está actualmente en progreso
(función)