std:: uncaught_exception, std:: uncaught_exceptions
|
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) |
std::uncaught_exception
detecta si el
desenrollado de pila
está actualmente en progreso.
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
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) |
|
|
(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. | Problema GOTW 47: Excepciones no capturadas |
| 2. |
Fundamentos de
std::uncaught_exceptions
(N4125)
|