std::uncaught_exception, std::uncaught_exceptions
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) |
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.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
[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";throwstd::runtime_error("excepcion de prueba");}catch(conststd::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) | |
(C++11) | Tipo de puntero compartido para la manipulación de objetos de excepción. (typedef) |
(C++11) | Captura la excepción actual en un std::exception_ptr (función) |