Namespaces
Variants

std::uncaught_exception, std::uncaught_exceptions

De es.cppreference.net
 
 
 
Definido en el encabezado <exception>
bool uncaught_exception() throw();
(1) (hasta C++11)
bool uncaught_exception() noexcept;
(desde C++11)
(obsoleto en C++17)
(eliminado en C++20)
int uncaught_exceptions() noexcept;
(2) (desde C++17)
(constexpr desde C++26)
1) Detecta si el hilo actual tiene un objeto de excepción vivo, es decir, se ha lanzado o relanzado una excepción y aún no ha entrado en una cláusula catch coincidente, std::terminate o std::unexpected. En otras palabras, std::uncaught_exception detecta si el desenrollado de la pila está actualmente en progreso.
2) Detecta cuántas excepciones en el hilo actual se han lanzado o relanzado y aún no han entrado en sus cláusulas catch coincidentes.

A veces es seguro lanzar una excepción incluso mientras std::uncaught_exception() == true(hasta C++17) std::uncaught_exceptions() > 0(desde C++17). Por ejemplo, si el desenrollado de la pila provoca la destrucción de un objeto, el destructor de ese objeto podría ejecutar código que lance una excepción siempre que la excepción sea capturada por algún bloque catch antes de escapar del destructor.

Valor de retorno

1) true si el desenrollado de la pila está actualmente en progreso en este hilo, false en caso contrario.
2) El número de objetos de excepción no capturados en el hilo actual.

Notas

Un ejemplo donde se utiliza uncaught_exceptions que retorna int es la biblioteca boost.log: la expresión BOOST_LOG(logger) << foo(); primero crea un objeto guardián y registra el número de excepciones no capturadas en su constructor. La salida se realiza por el destructor del objeto guardián a menos que foo() lance una excepción (en cuyo caso el número de excepciones no capturadas en el destructor es mayor que el observado por el constructor).

std::experimental::scope_fail y std::experimental::scope_success en LFTS v3 dependen de la funcionalidad de uncaught_exceptions, porque sus destructores necesitan hacer cosas diferentes que dependen de si se llama durante el desenrollado de la pila.

Macro de prueba de característica Valor Estándar Característica
__cpp_lib_uncaught_exceptions 201411L (C++17) std::uncaught_exceptions
__cpp_lib_constexpr_exceptions 202411L (C++26) constexpr para tipos de excepción

Ejemplo

#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';
    }
}

Posible salida:

Exception thrown
g.~Foo() called during stack unwinding
Exception caught: test exception
f.~Foo() called normally

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares C++ previamente publicados.

DR Aplicado a Comportamiento según lo publicado Comportamiento correcto
LWG 70 C++98 la especificación de excepción de uncaught_exception() faltaba especificado como throw()

Véase también

función llamada cuando falla el manejo de excepciones
(función)
tipo de puntero compartido para manejar objetos de excepción
(typedef)
captura la excepción actual en un std::exception_ptr
(función)

Enlaces externos

1.  GOTW issue 47: Uncaught Exceptions
2.  Justificación para std::uncaught_exceptions (N4125)