Compartir vía


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_exceptiones 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 o exit.

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.