Condividi tramite


<exception> funzioni

current_exception

Ottiene un puntatore intelligente all'eccezione corrente.

exception_ptr current_exception();

Valore restituito

Oggetto exception_ptr che punta all'eccezione corrente.

Osservazioni:

Chiama la funzione current_exception in un blocco catch. Se è in corso un'eccezione e il blocco catch riesce a rilevarla, la funzione current_exception restituisce un oggetto exception_ptr che fa riferimento a tale eccezione. In caso contrario, la funzione restituisce un oggetto exception_ptr Null.

La funzione current_exception acquisisce l'eccezione in corso, indipendentemente dal fatto che l'istruzione catch specifichi o meno un'istruzione exception-declaration.

Il distruttore dell'eccezione corrente viene chiamato alla fine del blocco catch se non si rigenera l'eccezione. Tuttavia, anche se si chiama la funzione current_exception nel distruttore, la funzione restituisce un oggetto exception_ptr che fa riferimento all'eccezione corrente.

Le chiamate successive alla funzione current_exception restituiscono oggetti exception_ptr che fanno riferimento a copie diverse dell'eccezione corrente. Di conseguenza, gli oggetti vengono considerati diversi perché fanno riferimento a copie diverse, anche se le copie presentano lo stesso valore binario.

make_exception_ptr

Crea un oggetto exception_ptr contenente la copia di un'eccezione.

template <class E>
    exception_ptr make_exception_ptr(E Except);

Parametri

Except
Classe con l'eccezione da copiare. In genere, è possibile specificare un oggetto della classe exceptionmake_exception_ptr come argomento della funzione , anche l'argomento può essere costituito da qualsiasi oggetto classe.

Valore restituito

Oggetto exception_ptr che punta a una copia dell'eccezione corrente per Except.

Osservazioni:

Chiamare la funzione make_exception_ptr equivale a generare una eccezione C++, rilevarla in un blocco catch, quindi chiamare la funzione current_exception per restituire un oggetto exception_ptr che fa riferimento a tale eccezione. L'implementazione Microsoft della funzione make_exception_ptr è più efficiente della generazione e del rilevamento di un'eccezione.

In genere un'applicazione non richiede la funzione make_exception_ptr e se ne sconsiglia l'utilizzo.

rethrow_exception

Genera un'eccezione passata come parametro.

void rethrow_exception(exception_ptr P);

Parametri

P
Eccezione rilevata da generare nuovamente. Se P è un exception_ptr Null, la funzione genera std::bad_exception.

Osservazioni:

Dopo aver archiviato un'eccezione intercettata in un oggetto exception_ptr, il thread principale può elaborare l'oggetto. Nel thread principale, chiamare la funzione rethrow_exception insieme all'oggetto exception_ptr come suo argomento. La funzione rethrow_exception estrae l'eccezione dall'oggetto exception_ptr, quindi genera l'eccezione nel contesto del thread principale.

get_terminate

Ottiene la funzione terminate_handler corrente.

terminate_handler get_terminate();

set_terminate

Crea un nuovo terminate_handler da chiamare al termine del programma.

terminate_handler set_terminate(terminate_handler fnew) throw();

Parametri

fnew
Funzione da chiamare alla chiusura.

Valore restituito

Indirizzo della funzione precedente chiamata alla chiusura.

Osservazioni:

La funzione stabilisce un nuovo terminate_handler come funzione * fnew. Pertanto, fnew non deve essere un puntatore Null. La funzione restituisce l'indirizzo del gestore di terminazione precedente.

Esempio

// 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

Ottiene la funzione unexpected_handler corrente.

unexpected_handler get_unexpected();

rethrow_if_nested

template <class E>
    void rethrow_if_nested(const E& e);

Osservazioni:

Se non è un tipo di classe polimorfica o se nested_exception è inaccessibile o ambiguo, non vi è alcun effetto. In caso contrario, esegue un cast dinamico.

set_unexpected

Stabilisce un nuovo unexpected_handler quando viene rilevata un'eccezione imprevista.

unexpected_handler set_unexpected(unexpected_handler fnew) throw();

Parametri

fnew
Funzione da chiamare quando viene rilevata un'eccezione imprevista.

Valore restituito

Indirizzo dell'oggetto unexpected_handler precedente.

Osservazioni:

fnew non deve essere un puntatore Null.

Lo standard C++ richiede che venga chiamato unexpected quando una funzione genera un'eccezione che non si trova nell'elenco throw. L'implementazione corrente non supporta questa condizione. Nell'esempio seguente viene chiamato direttamente unexpected, che a sua volta chiama unexpected_handler.

Esempio

// 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

Chiama un gestore di terminazione.

void terminate();

Osservazioni:

La funzione chiama un gestore di terminazione, una funzione di tipo void. Se terminate viene chiamato direttamente dal programma, il gestore terminate è quello impostato più di recente da una chiamata a set_terminate. Se terminate viene chiamato per uno qualsiasi di altri motivi durante la valutazione di un'espressione throw, il gestore di terminazione è quello in vigore immediatamente dopo la valutazione dell'espressione throw.

Un gestore di terminazione potrebbe non restituire risultati al relativo chiamante. All'avvio del programma, il gestore terminate è una funzione che chiama abort.

Esempio

Per un esempio dell'utilizzo di terminate, vedere set_unexpected.

throw_with_nested

template <class T> [[noreturn]]
    void throw_with_nested(T&& t);

Osservazioni:

Genera un'eccezione con eccezioni annidate.

uncaught_exception

Restituisce true solo se un'eccezione generata è in corso di elaborazione.

bool uncaught_exception();

Valore restituito

Restituisce true dopo aver completato la valutazione di un'espressione throw e prima di aver completato l'inizializzazione della dichiarazione di eccezione del gestore corrispondente o aver chiamato la funzione unexpected come risultato dell'espressione throw. In particolare uncaught_exception restituirà true in seguito alla chiamata da un distruttore richiamato durante la rimozione di un'eccezione. Nei dispositivi la funzione uncaught_exception è supportata solo in Windows CE 5.00 e versioni successive, comprese le piattaforme Windows Mobile 2005.

Esempio

// 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

imprevisto

Chiama il gestore imprevisto.

void unexpected();

Osservazioni:

Lo standard C++ richiede che venga chiamato unexpected quando una funzione genera un'eccezione che non si trova nell'elenco throw. L'implementazione corrente non supporta questa condizione. Nell'esempio la funzione unexpected viene chiamata direttamente e a sua volta chiama il gestore imprevisto.

La funzione chiama un gestore imprevisto, una funzione di tipo void. Se la funzione unexpected viene chiamata direttamente dal programma, il gestore imprevisto è quello impostato più di recente da una chiamata a set_unexpected.

Un gestore imprevisto potrebbe non restituire risultati al relativo chiamante. Potrebbe terminare l'esecuzione in uno dei modi seguenti:

  • Generando un oggetto di un tipo elencato nella specifica di eccezione o un oggetto di qualsiasi tipo, se il gestore imprevisto viene chiamato direttamente dal programma.

  • Generando un oggetto di tipo bad_exception.

  • Chiamata di terminate o exitabort .

All'avvio del programma, il gestore imprevisto è una funzione che chiama terminate.

Esempio

Per un esempio dell'utilizzo di unexpected, vedere set_unexpected.