Namensräume
Varianten
Aktionen

std::terminate

Von cppreference.com
< cpp‎ | error
 
 
 
Definiert in Header <exception>
void terminate();
(bis C++11)
[[noreturn]] void terminate() noexcept;
(seit C++11)

std::terminate() wird von der C++-Laufzeitumgebung aufgerufen, wenn das Programm aus einem der folgenden Gründe nicht fortgesetzt werden kann

1) Eine Ausnahme wird geworfen und nicht abgefangen (es ist implementierungsabhängig, ob in diesem Fall ein Stack-Unwinding durchgeführt wird).
2) Eine Funktion, die direkt vom Ausnahmeallegemechanismus beim Behandeln einer noch nicht abgefangenen Ausnahme aufgerufen wird, endet mit einer Ausnahme (z.B. ein Destruktor eines lokalen Objekts oder ein Kopierkonstruktor, der einen Catch-Parameter konstruiert).
3) Der Konstruktor oder der Destruktor eines statischen oder Thread-lokalen(seit C++11) Objekts wirft eine Ausnahme.
4) Eine mit std::atexit oder std::at_quick_exit(seit C++11) registrierte Funktion wirft eine Ausnahme.
5) Eine dynamische Ausnahmespezifikation wird verletzt und der Standardhandler für std::unexpected wird ausgeführt.
6) Ein Nicht-Standard-Handler für std::unexpected wirft eine Ausnahme, die die zuvor verletzte dynamische Ausnahmespezifikation verletzt, wenn die Spezifikation std::bad_exception nicht einschließt.
(bis C++17)
7) Eine noexcept-Spezifikation wird verletzt (es ist implementierungsabhängig, ob in diesem Fall ein Stack-Unwinding durchgeführt wird).
8) std::nested_exception::rethrow_nested wird für ein Objekt aufgerufen, das keine erfasste Ausnahme enthält.
9) Eine Ausnahme wird aus der Initialfunktion eines std::thread geworfen.
10) Ein joinable std::thread wird zerstört oder zugewiesen.
11) std::condition_variable::wait, std::condition_variable::wait_until oder std::condition_variable::wait_for erreicht seine Postcondition nicht (z.B. wenn das erneute Sperren des Mutex eine Ausnahme wirft).
(seit C++11)
12) Eine Funktion, die von einem parallelen Algorithmus aufgerufen wird, endet mit einer nicht abgefangenen Ausnahme und die Ausführungsrichtlinie gibt eine Beendigung an.
(seit C++17)

std::terminate() kann auch direkt vom Programm aufgerufen werden.

Wenn std::terminate aufgrund einer geworfenen Ausnahme aufgerufen wird, wird ein impliziter Try/Catch-Handler als aktiv betrachtet. Daher gibt der Aufruf von std::current_exception die geworfene Ausnahme zurück.

In jedem Fall ruft std::terminate den aktuell installierten std::terminate_handler auf. Der Standard-std::terminate_handler ruft std::abort auf.

Wenn ein Destruktor den terminate-Handler während des Stack-Unwindings zurücksetzt und das Unwinding später dazu führte, dass terminate aufgerufen wurde, ist der Handler, der am Ende des Throw-Ausdrucks installiert wurde, derjenige, der aufgerufen wird. (Hinweis: Es war unklar, ob das erneute Werfen neue Handler anwendet)

(bis C++11)

Wenn ein Destruktor den terminate-Handler während des Stack-Unwindings zurücksetzt, ist es undefiniert, welcher Handler aufgerufen wird, wenn das Unwinding später dazu führte, dass terminate aufgerufen wurde.

(seit C++11)

[bearbeiten] Anmerkungen

Wenn der Handler-Mechanismus nicht gewünscht ist, z.B. weil er atomare Operationen erfordert, die die Binärgröße aufblähen können, wird ein direkter Aufruf von std::abort bevorzugt, wenn das Programm abnormal beendet wird.

Einige Compiler-Intrinsics, z.B. __builtin_trap (gcc, clang und icc) oder __debugbreak (msvc), können verwendet werden, um das Programm so schnell wie möglich zu beenden.

[bearbeiten] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 2111 C++11 Effekt des Aufrufs von std::set_terminate während des Stacks
Unwinding unterscheidet sich von C++98 und bricht einige ABIs
wurde nicht spezifiziert

[bearbeiten] Siehe auch

der Typ der Funktion, die von std::terminate aufgerufen wird
(Typedef) [bearbeiten]
verursacht abnormalen Programmabbruch (ohne Bereinigung)
(funktion) [bearbeiten]
pausiert das laufende Programm, wenn es aufgerufen wird
(Funktion) [bearbeiten]