Namespaces
Variants

std:: rethrow_exception

From cppreference.net
Definido en el encabezado <exception>
[ [ noreturn ] ] void rethrow_exception ( std:: exception_ptr p ) ;
(desde C++11)
(constexpr desde C++26)

Lanza el objeto de excepción previamente capturado referido por el puntero de excepción p , o una copia de ese objeto.

No está especificado si se realiza una copia. Si se realiza una copia, el almacenamiento para ella se asigna de manera no especificada.

El comportamiento es indefinido si p es nulo.

Contenidos

Parámetros

p - no nulo std::exception_ptr

Excepciones

El objeto de excepción referido por p si no se realiza ninguna copia.

De lo contrario, una copia de dicho objeto de excepción si la implementación copió exitosamente el objeto de excepción.

De lo contrario, std::bad_alloc o la excepción lanzada al copiar el objeto de excepción, si la asignación o la copia fallan, respectivamente.

Notas

Antes de P1675R2 , rethrow_exception no estaba permitido copiar el objeto de excepción, lo cual es imposible de implementar en algunas plataformas donde los objetos de excepción se asignan en la pila.

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)
captura la excepción actual en un std::exception_ptr
(función)