Espacios de nombres
Variantes
Acciones

std::uncaught_exception, std::uncaught_exceptions

De cppreference.com
< cpp‎ | error
 
 
Biblioteca de servicios
 
Control de errores
Control de excepciones
uncaught_exceptionuncaught_exceptions
(hasta C++20)(C++17)
Fallas del control de excepciones
(hasta C++17)
(hasta C++17)
(C++11)(hasta C++17)
(hasta C++17)
Códigos de error
Códigos de error
 
Definido en el archivo de encabezado <exception>
(1)
bool uncaught_exception() throw();
(hasta C++11)
bool uncaught_exception() noexcept;
(desde C++11)
(en desuso en C++17)
(eliminado en C++20)
int uncaught_exceptions() noexcept;
(2) (desde C++17)
1) Detecta si el hilo actual tiene un objeto de excepción vivo. Es decir, se ha lanzado o vuelto a lanzar una excepción y todavía no se ha ingresado a una cláusula catch coincidente, a std::terminate o a std::unexpected. En otras palabras, std::uncaught_exception detectas si el desenredo de la pila está en curso.
2) Detecta cuántas excepciones se han lanzado o se han vuelto a lanzar en el hilo actual y aún no sea ha ingresado a sus cláusulas catch coincidentes.

A veces es seguro lanzar una excepción aun cuando std::uncaught_exception() == true. Por ejemplo, si el desenredo de la pila ocasiona que se destruya un objeto, el destructor de ese objeto podría ejecutar código que lanza una excepción siempre y cuando la excepción se atrape por algún bloque catch antes de que se escape del destructor.

Contenido

[editar] Parámetros

(Ninguno)

[editar] Valor de retorno

1) true si el desenredo de pila está en curso en este hilo.
2) El número de objetos de excepción no atrapados en el hilo actual.

[editar] Notas

Un ejemplo donde se usa uncaught_exceptions que devuelve enteros es en la biblioteca boost.log: la expresión BOOST_LOG(logger) << foo(); primero crea un objeto guardia y graba el número de excepciones sin atrapar en su constructor. La salida se realiza por el destructor del objeto guardia a menos que foo() lance (en cuyo caso el número de excepciones sin atrapar en el destructor es mayor que el número que se observó en el constructor).

[editar] Ejemplo

#include <iostream>
#include <exception>
#include <stdexcept>
 
struct Foo {
    int count = std::uncaught_exceptions();
    ~Foo() {
        std::cout << (count == std::uncaught_exceptions()
            ? "~Foo() llamado normalmente\n"
            : "~Foo() llamado durante desenredo de la pila\n");
    }
};
int main()
{
    Foo f;
    try {
        Foo f;
        std::cout << "Excepcion lanzada\n";
        throw std::runtime_error("excepcion de prueba");
    } catch (const std::exception& e) {
        std::cout << "Excepcion atrapada: " << e.what() << '\n';
    }
}

Salida:

Excepcion lanzada
~Foo() llamado durante desenredo de la pila
Excepcion atrapada: excepcion de prueba
~Foo() llamado normalmente

[editar] Véase también

Función llamada cuando falla el control de excepciones.
(función) [editar]
Tipo de puntero compartido para la manipulación de objetos de excepción.
(typedef) [editar]
Captura la excepción actual en un std::exception_ptr
(función) [editar]

[editar] Enlaces externos