std:: current_exception
|
Definido en el encabezado
<exception>
|
||
|
std::
exception_ptr
current_exception
(
)
noexcept
;
|
(desde C++11)
(constexpr desde C++26) |
|
Si se llama durante el manejo de excepciones (típicamente, en una cláusula
catch
), captura el objeto de excepción actual y crea un
std::exception_ptr
que contiene una copia o una referencia a ese objeto de excepción (dependiendo de la implementación). El objeto referenciado permanece válido al menos mientras exista un objeto
exception_ptr
que haga referencia al mismo.
Si la implementación de esta función requiere una llamada a new y la llamada falla, el puntero devuelto contendrá una referencia a una instancia de std::bad_alloc .
Si la implementación de esta función requiere copiar el objeto de excepción capturado y su constructor de copia lanza una excepción, el puntero devuelto contendrá una referencia a la excepción lanzada. Si el constructor de copia del objeto de excepción lanzado también lanza, el puntero devuelto puede contener una referencia a una instancia de std::bad_exception para romper el bucle infinito.
Si la función es llamada cuando no se está manejando ninguna excepción, se retorna un std::exception_ptr vacío.
Esta función puede ser llamada en un std::terminate_handler para recuperar la excepción que ha provocado la invocación de std::terminate .
Contenidos |
Valor de retorno
Una instancia de std::exception_ptr que contiene una referencia al objeto de excepción, o una copia del objeto de excepción, o a una instancia de std::bad_alloc o a una instancia de std::bad_exception .
Notas
En las implementaciones que siguen Itanium C++ ABI (GCC, Clang, etc), las excepciones se asignan en el montículo cuando se lanzan (excepto para std::bad_alloc en algunos casos), y esta función simplemente crea el puntero inteligente que referencia el objeto previamente asignado. En MSVC, las excepciones se asignan en la pila cuando se lanzan, y esta función realiza la asignación en el montículo y copia el objeto de excepción.
En Windows en entornos CLR administrados [1] , la implementación almacenará un std::bad_exception cuando la excepción actual sea una excepción administrada ( [2] ). Nótese que catch ( ... ) también captura excepciones administradas:
#include <exception> int main() { try { throw gcnew System::Exception("Managed exception"); } catch (...) { std::exception_ptr ex = std::current_exception(); try { std::rethrow_exception(ex); } catch (std::bad_exception const &) { // Esto será impreso. std::cout << "Bad exception" << std::endl; } } }
| Macro de prueba de características | Valor | Std | Característica |
|---|---|---|---|
__cpp_lib_constexpr_exceptions
|
202411L
|
(C++26) | constexpr para tipos de excepción |
Ejemplo
#include <exception> #include <iostream> #include <stdexcept> #include <string> void handle_eptr(std::exception_ptr eptr) // passing by value is OK { try { if (eptr) std::rethrow_exception(eptr); } catch(const std::exception& e) { std::cout << "Caught exception: '" << e.what() << "'\n"; } } int main() { std::exception_ptr eptr; try { [[maybe_unused]] char ch = std::string().at(1); // this generates a std::out_of_range } catch(...) { eptr = std::current_exception(); // capture } handle_eptr(eptr); } // destructor for std::out_of_range called here, when the eptr is destructed
Salida posible:
Caught exception: 'basic_string::at: __n (which is 1) >= this->size() (which is 0)'
Véase también
|
(C++11)
|
tipo de puntero compartido para manejar objetos de excepción
(typedef) |
|
(C++11)
|
lanza la excepción desde un
std::exception_ptr
(función) |
|
(C++11)
|
crea un
std::exception_ptr
desde un objeto de excepción
(plantilla de función) |
|
(
eliminado en C++20*
)
(C++17)
|
verifica si el manejo de excepciones está actualmente en progreso
(función) |