<exception> -Funktionen

current_exception

Erhält einen intelligenten Zeiger auf die aktuelle Ausnahme.

exception_ptr current_exception();

Rückgabewert

Ein exception_ptr-Objekt, das auf die aktuelle Ausnahme zeigt.

Hinweise

Rufen Sie die current_exception-Funktion in einem catch-Block auf. Wenn eine Ausnahme aktiv ist und die Ausnahme vom catch-Block nicht abgefangen werden kann, gibt die current_exception-Funktion ein exception_ptr-Objekt zurück, das auf die Ausnahme verweist. Andernfalls gibt die Funktion ein NULL-exception_ptr-Objekt zurück.

Die current_exception-Funktion erfasst die Ausnahme, die aktiv ist, unabhängig davon, ob die catch-Anweisung eine exception-declaration-Anweisung angibt.

Der Destruktor für die aktuelle Ausnahme wird am Ende des catch-Blocks aufgerufen, wenn die Ausnahme nicht erneut ausgelöst wird. Auch wenn Sie die current_exception-Funktion im Destruktor aufrufen, gibt die Funktion ein exception_ptr-Objekt zurück, das auf die aktuelle Ausnahme verweist.

Aufeinander folgende Aufrufe der current_exception-Funktion geben exception_ptr-Objekte zurück, die sich auf unterschiedliche Kopien der aktuellen Ausnahme beziehen. Folglich sind die Objekte bei einem Vergleich ungleich, da sie auf unterschiedliche Kopien verweisen, auch wenn die Kopien den gleichen Binärwert aufweisen.

make_exception_ptr

Erstellt ein exception_ptr-Objekt, das eine Kopie einer Ausnahme enthält.

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

Parameter

Except
Die Klasse mit der zu kopierenden Ausnahme. Normalerweise geben Sie ein exception class-Objekt als Argument für die make_exception_ptr-Funktion an, obwohl jedes Klassenobjekt als Argument zulässig ist.

Rückgabewert

Ein exception_ptr-Objekt , das auf eine Kopie der aktuellen Ausnahme verweist, mit Ausnahme.

Hinweise

Das Aufrufen der make_exception_ptr-Funktion ist gleichbedeutend mit dem Auslösen einer C++-Ausnahme, die in einem catch-Block abgefangen wird, und dem anschließenden Aufrufen der current_exception-Funktion, um ein exception_ptr-Objekt zurückzugeben, das auf die Ausnahme verwiest. Die Microsoft-Implementierung der make_exception_ptr-Funktion ist effizienter als das Auslösen und anschließende Abfangen einer Ausnahme.

Eine Anwendung erfordert in der Regel nicht die make_exception_ptr -Funktion, und es wird von ihrer Verwendung abgeraten.

rethrow_exception

Löst eine Ausnahme aus, die als Parameter übergeben wird.

void rethrow_exception(exception_ptr P);

Parameter

P
Die erneut auszulösende abgefangene Ausnahme. Wenn P ein NULL-exception_ptr ist, löst die Funktion "std::bad_exception" aus.

Hinweise

Nachdem Sie eine abgefangene Ausnahme in einem exception_ptr-Objekt gespeichert haben, kann der primäre Thread das Objekt verarbeiten. Rufen Sie in Ihrem primären Thread die rethrow_exception-Funktion zusammen mit dem exception_ptr-Objekt als Argument auf. Die rethrow_exception-Funktion extrahiert die Ausnahme vom exception_ptr-Objekt und löst die Ausnahme anschließend im Kontext des primären Threads aus.

get_terminate

Ruft die aktuelle terminate_handler-Funktion ab.

terminate_handler get_terminate();

set_terminate

Richtet ein neues terminate_handler-Element ein, das bei Beendigung des Programms aufgerufen wird.

terminate_handler set_terminate(terminate_handler fnew) throw();

Parameter

fnew
Die bei Beendigung aufzurufende Funktion.

Rückgabewert

Die Adresse der vorherigen Funktion, die von bei Beendigung aufgerufen wurde.

Hinweise

Die Funktion richtet eine neue terminate_handler als Funktion * fnew ein. Daher darf fnew kein Nullzeiger sein. Die Funktion gibt die Adresse des vorherigen terminate-Handlers zurück.

Beispiel

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

Ruft die aktuelle unexpected_handler-Funktion ab.

unexpected_handler get_unexpected();

rethrow_if_nested

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

Hinweise

Wenn kein polymorpher Klassentyp oder nicht nested_exception darauf zugegriffen oder mehrdeutig ist, gibt es keine Auswirkung. Andernfalls wird eine dynamische Umwandlung ausgeführt.

set_unexpected

Richtet ein neues unexpected_handler ein, das bei einer unerwarteten Ausnahme auftritt.

unexpected_handler set_unexpected(unexpected_handler fnew) throw();

Parameter

fnew
Die Funktion, die bei einer unerwarteten Ausnahme aufgerufen wird.

Rückgabewert

Die Adresse des vorherigen unexpected_handler-Elements.

Hinweise

fnew darf kein Nullzeiger sein.

Für den C++-Standard ist es erforderlich, dass unexpected aufgerufen wird, wenn eine Funktion eine Ausnahme auslöst, die nicht auf der Auslöseliste aufgeführt wird. Die augenblickliche Implementierung unterstützt das nicht. Im folgenden Beispiel ruft unexpected direkt auf, woraufhin unexpected_handler aufgerufen wird.

Beispiel

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

Ruft einen terminate-Handler auf.

void terminate();

Hinweise

Die Funktion ruft einen terminate-Handler auf, eine Funktion vom Typ void. Wenn terminate der Handler direkt vom Programm aufgerufen wird, ist der Terminhandler der zuletzt durch einen Aufruf von set_terminate festgelegt. Wenn terminate während der Auswertung eines Auslösenausdrucks aus mehreren anderen Gründen aufgerufen wird, ist der Beendigungshandler das Ereignis, das unmittelbar nach der Auswertung des Auslösenausdrucks wirksam ist.

Ein terminate-Handler kehrt möglicherweise nicht zum Aufrufer zurück. Beim Programmstart ist der Beendigungshandler eine Funktion, die aufgerufen wird abort.

Beispiel

Ein Beispiel zur Verwendung von terminate finden Sie unter set_unexpected.

throw_with_nested

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

Hinweise

Löst Ausnahme mit geschachtelten Ausnahmen aus.

uncaught_exception

Gibt nur dann true zurück, wenn augenblicklich eine Ausnahme verarbeitet wird.

bool uncaught_exception();

Rückgabewert

Gibt true nach Abschluss der Auswertung eines Throw-Ausdrucks und vor Abschluss der Initialisierung der Ausnahmedeklaration an den entsprechenden Handler oder durch Aufruf von unexpected als Ergebnis des Throw-Ausdrucks zurück. Insbesondere gibt uncaught_exceptiontrue zurück, wenn die Funktion von einem Destruktor aufgerufen wird, der während des Entladevorgangs für die Ausnahme aufgerufen wird. Auf Geräten wird uncaught_exception nur auf Windows CE 5.00 und höheren Versionen, darunter Windows Mobile 2005-Plattformen unterstützt.

Beispiel

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

Unerwartet

Ruft den unerwarteten Handler auf.

void unexpected();

Hinweise

Für den C++-Standard ist es erforderlich, dass unexpected aufgerufen wird, wenn eine Funktion eine Ausnahme auslöst, die nicht auf der Auslöseliste aufgeführt wird. Die augenblickliche Implementierung unterstützt das nicht. Das Beispiel ruft unexpected direkt auf, wodurch der unerwartete Handler aufgerufen wird.

Die Funktion ruft einen unerwarteten Handler auf, eine Funktion vom Typ void. Wenn unexpected direkt vom Programm aufgerufen wird, ist der unerwartete Handler durch einen Aufruf von set_unexpected der zuletzt festgelegte Handler.

Ein unerwarteter Handler kehrt möglicherweise nicht zum Aufrufer zurück. Die Ausführung kann hierdurch beendet werden:

  • Auslösen eines Objekts eines Typs, das in der Ausnahmespezifikation gelistet ist oder eines Objekts jeglichen Typs, wenn der unerwartete Handler direkt durch das Programm aufgerufen wird.

  • Auslösen eines Objekt des Typs bad_exception.

  • Anruf wird beendet oder exitabort .

Bei Programmstart ist der unerwartete Handler eine Funktion, die erminate aufruft.

Beispiel

Ein Beispiel zur Verwendung von unexpected finden Sie unter set_unexpected.