std::uncaught_exception, std::uncaught_exceptions
| 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) |
std::uncaught_exception detecta si el desenrollado de la pila está actualmente en progreso.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
true si el desenrollado de la pila está actualmente en progreso en este hilo, false en caso contrario.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) | |
(C++11) |
tipo de puntero compartido para manejar objetos de excepción (typedef) |
(C++11) |
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)
|