funciones<exception>
current_exception
Obtiene un puntero inteligente a la excepción actual.
exception_ptr current_exception();
Valor devuelto
Objeto exception_ptr que apunta a la excepción actual.
Comentarios
Llame a la función current_exception
en un bloque catch. Si una excepción está en vuelo y el bloque catch puede detectarla, la función current_exception
devuelve un objeto exception_ptr
que hace referencia a la excepción. De lo contrario, la función devuelve un objeto exception_ptr
NULL.
La función current_exception
captura la excepción que está en vuelo independientemente de si la instrucción catch
especifica una instrucción de declaración de excepción o no.
Se llama al destructor de la excepción actual al final del bloque catch
si no vuelve a producir la excepción. En cambio, incluso aunque llame a la funcióncurrent_exception
en el destructor, la función devuelve un objeto exception_ptr
que hace referencia a la excepción actual.
Las llamadas sucesivas a la función current_exception
devuelven objetos exception_ptr
que hacen referencia a distintas copias de la excepción actual. Por tanto, al comparar los objetos se consideran diferentes porque hacen referencia a copias distintas, incluso aunque las copias tengan el mismo valor binario.
make_exception_ptr
Crea un objeto exception_ptr que contiene una copia de una excepción.
template <class E>
exception_ptr make_exception_ptr(E Except);
Parámetros
Except
Clase con la excepción que se va a copiar. Normalmente, se especifica un objeto exception (Clase) como argumento para la función make_exception_ptr
, aunque el argumento puede ser cualquier objeto de clase.
Valor devuelto
Objeto exception_ptr que apunta a una copia de la excepción actual para Except.
Comentarios
Llamar a la función make_exception_ptr
equivale a iniciar una excepción de C++, detectarla en un bloque catch y llamar después a la función current_exception para devolver un objeto exception_ptr
que hace referencia a la excepción. La implementación de Microsoft de la función make_exception_ptr
es más eficaz que producir y detectar después una excepción.
Una aplicación no suele necesitar la función make_exception_ptr
y desaconsejamos su uso.
rethrow_exception
Inicia una excepción pasada como parámetro.
void rethrow_exception(exception_ptr P);
Parámetros
P
Excepción detectada que se va a volver a iniciar. Si P es una exception_ptr null, la función inicia std::bad_exception.
Comentarios
Después de almacenar una excepción detectada en un objeto exception_ptr
, el subproceso principal puede procesar el objeto. En el subproceso principal, llame a la función rethrow_exception
junto con el objeto exception_ptr
como argumento. La función rethrow_exception
extrae la excepción del objeto exception_ptr
y después produce la excepción en el contexto del subproceso principal.
get_terminate
Obtiene la función terminate_handler
actual.
terminate_handler get_terminate();
set_terminate
Establece un nuevo terminate_handler
al que se llamará cuando finalice el programa.
terminate_handler set_terminate(terminate_handler fnew) throw();
Parámetros
fnew
Función a la que se va a llamar en la finalización.
Valor devuelto
Dirección de la función anterior al a que se solía llamar en la finalización.
Comentarios
La función establece un nuevo terminate_handler como la función * fnew. Por tanto, fnew no debe ser un puntero nulo. La función devuelve la dirección del controlador de finalización anterior.
Ejemplo
// exception_set_terminate.cpp
// compile with: /EHsc
#include <exception>
#include <iostream>
using namespace std;
void termfunction()
{
cout << "My terminate function called." << endl;
abort();
}
int main()
{
terminate_handler oldHandler = set_terminate(termfunction);
// Throwing an unhandled exception would also terminate the program
// or we could explicitly call terminate();
//throw bad_alloc();
terminate();
}
get_unexpected
Obtiene la función unexpected_handler
actual.
unexpected_handler get_unexpected();
rethrow_if_nested
template <class E>
void rethrow_if_nested(const E& e);
Comentarios
Si no es un tipo de clase polimórfico, o si nested_exception
es inaccesible o ambiguo, no hay ningún efecto. De lo contrario, realiza una conversión dinámica.
set_unexpected
Establece un nuevo unexpected_handler
cuando se encuentra una excepción inesperada.
unexpected_handler set_unexpected(unexpected_handler fnew) throw();
Parámetros
fnew
Función a la que se llamará cuando se encuentre una excepción inesperada.
Valor devuelto
Dirección del unexpected_handler
anterior.
Comentarios
fnew no debe ser un puntero null.
El estándar de C++ requiere que se llame a unexpected
cuando una función inicie una excepción que no está en su lista de excepciones. La implementación actual no lo admite. En el ejemplo siguiente se llama a unexpected
directamente, que llama a unexpected_handler
.
Ejemplo
// exception_set_unexpected.cpp
// compile with: /EHsc
#include <exception>
#include <iostream>
using namespace std;
void uefunction()
{
cout << "My unhandled exception function called." << endl;
terminate(); // this is what unexpected() calls by default
}
int main()
{
unexpected_handler oldHandler = set_unexpected(uefunction);
unexpected(); // library function to force calling the
// current unexpected handler
}
terminate
Llama a un controlador de finalización.
void terminate();
Comentarios
La función llama a un controlador de finalización, una función de tipo void
. Si se llama directamente a terminate
mediante el programa, el controlador de finalización es el establecido más recientemente por una llamada a set_terminate. Si se llama a terminate
por cualquiera de muchas otras razones durante la evaluación de una expresión iniciada, el controlador de finalización es el que está en vigor inmediatamente después de evaluar la expresión iniciada.
Un controlador de finalización no puede volver a su llamador. Al inicio del programa, el controlador de finalización es una función que llama a abort
.
Ejemplo
Vea set_unexpected para obtener un ejemplo de uso de terminate
.
throw_with_nested
template <class T> [[noreturn]]
void throw_with_nested(T&& t);
Comentarios
Produce una excepción con excepciones anidadas.
uncaught_exception
Devuelve true
solo si se está procesando actualmente una excepción iniciada.
bool uncaught_exception();
Valor devuelto
Devuelve true
después de completar la evaluación de una expresión iniciada y antes de completar la inicialización de la declaración de excepción en el controlador correspondiente o llamar a unexpected como resultado de la expresión iniciada. En particular, uncaught_exception
devolverá true
cuando se llame desde un destructor que se está invocando durante un desenredo de excepción. En dispositivos, uncaught_exception
solo se admite en Windows CE 5.00 y versiones posteriores, incluidas las plataformas Windows Mobile 2005.
Ejemplo
// exception_uncaught_exception.cpp
// compile with: /EHsc
#include <exception>
#include <iostream>
#include <string>
class Test
{
public:
Test( std::string msg ) : m_msg( msg )
{
std::cout << "In Test::Test(\"" << m_msg << "\")" << std::endl;
}
~Test( )
{
std::cout << "In Test::~Test(\"" << m_msg << "\")" << std::endl
<< " std::uncaught_exception( ) = "
<< std::uncaught_exception( )
<< std::endl;
}
private:
std::string m_msg;
};
// uncaught_exception will be true in the destructor
// for the object created inside the try block because
// the destructor is being called as part of the unwind.
int main( void )
{
Test t1( "outside try block" );
try
{
Test t2( "inside try block" );
throw 1;
}
catch (...) {
}
}
In Test::Test("outside try block")
In Test::Test("inside try block")
In Test::~Test("inside try block")
std::uncaught_exception( ) = 1
In Test::~Test("outside try block")
std::uncaught_exception( ) = 0
inesperado
Llama al controlador inesperado.
void unexpected();
Comentarios
El estándar de C++ requiere que se llame a unexpected
cuando una función inicie una excepción que no está en su lista de excepciones. La implementación actual no lo admite. El ejemplo llama a unexpected
directamente, que llama al controlador inesperado.
La función llama a un controlador inesperado, una función de tipo void
. Si el programa llama directamente a unexpected
, el controlador inesperado es el establecido más recientemente por una llamada a set_unexpected.
Un controlador inesperado no puede volver a su llamador. Puede finalizar la ejecución al:
Iniciar un objeto de un tipo enumerado en la especificación de excepción o un objeto de cualquier tipo, si el programa llama directamente al controlador inesperado.
Iniciar un objeto de tipo bad_exception.
Llamar a terminate,
abort
oexit
.
Al inicio del programa, el controlador inesperado es una función que llama a terminate.
Ejemplo
Vea set_unexpected para obtener un ejemplo de uso de unexpected
.