Namespaces
Variants

std:: uncaught_exception, std:: uncaught_exceptions

From cppreference.net
Definido en el encabezado <exception>
(1)
bool uncaught_exception ( ) throw ( ) ;
(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 activo, es decir, si se ha lanzado o relanzado una excepción y aún no ha entrado en una cláusula catch correspondiente, std::terminate o std::unexpected . En otras palabras, std::uncaught_exception detecta si el desenrollado de pila está actualmente en progreso.
2) Detecta cuántas excepciones en el hilo actual han sido lanzadas o relanzadas y aún no han entrado en sus cláusulas catch correspondientes.

A veces es seguro lanzar una excepción incluso mientras std :: uncaught_exception ( ) == true (until C++17) std :: uncaught_exceptions ( ) > 0 (since C++17) . Por ejemplo, si el desenrollado de pila causa que un objeto sea destruido, el destructor para 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.

Contenidos

Parámetros

(ninguno)

Valor de retorno

1) true si el desenrollado de 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 la función que retorna un entero uncaught_exceptions es la biblioteca boost.log : la expresión BOOST_LOG ( logger ) << foo ( ) ; primero crea un objeto guardia y registra el número de excepciones no capturadas en su constructor. La salida se realiza mediante el destructor del objeto guardia a menos que foo ( ) lance una excepción (en cuyo caso el número de excepciones no capturadas en el destructor es mayor que lo 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 realizar acciones diferentes que dependen de si son llamados durante el desenrollado de pila.

Macro de prueba de características Valor Std 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';
    }
}

Salida posible:

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 de C++ publicados anteriormente.

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

Véase también

función llamada cuando el manejo de excepciones falla
(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. Problema GOTW 47: Excepciones no capturadas
2. Fundamentos de std::uncaught_exceptions (N4125)