std::uncaught_exception, std::uncaught_exceptions
| Definiert in Header <exception> |
||
| (1) | ||
| bool uncaught_exception() throw(); |
(bis C++11) | |
| bool uncaught_exception() noexcept; |
(seit C++11) (veraltet in C++17) (in C++20 entfernt) |
|
int uncaught_exceptions() noexcept; |
(2) | (seit C++17) (constexpr seit C++26) |
std::uncaught_exception stellt fest, ob Stack Unwinding gerade stattfindet.Manchmal ist es sicher, eine Ausnahme zu werfen, auch wenn std::uncaught_exception() = true(bis C++17) std::uncaught_exceptions() > 0(seit C++17). Zum Beispiel, wenn Stack Unwinding dazu führt, dass ein Objekt zerstört wird, könnte der Destruktor dieses Objekts Code ausführen, der eine Ausnahme wirft, solange die Ausnahme von einem Catch-Block abgefangen wird, bevor sie den Destruktor verlässt.
Inhalt |
[bearbeiten] Parameter
(keine)
[bearbeiten] Rückgabewert
[bearbeiten] Hinweise
Ein Beispiel, in dem `uncaught_exceptions` mit Rückgabe eines `int` verwendet wird, ist die boost.log Bibliothek: Der Ausdruck BOOST_LOG(logger) << foo(); erstellt zuerst ein Guard-Objekt und speichert die Anzahl der nicht abgefangenen Ausnahmen in seinem Konstruktor. Die Ausgabe wird vom Destruktor des Guard-Objekts durchgeführt, es sei denn, `foo()` wirft eine Ausnahme (in diesem Fall ist die Anzahl der nicht abgefangenen Ausnahmen im Destruktor größer als die, die der Konstruktor beobachtet hat).
std::experimental::scope_fail und std::experimental::scope_success in LFTS v3 setzen auf die Funktionalität von `uncaught_exceptions`, da ihre Destruktoren unterschiedliche Dinge tun müssen, die davon abhängen, ob sie während des Stack Unwindings aufgerufen werden.
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_uncaught_exceptions |
201411L |
(C++17) | std::uncaught_exceptions
|
__cpp_lib_constexpr_exceptions |
202411L |
(C++26) | constexpr für Ausnahme-Typen |
[bearbeiten] Beispiel
#include <exception> #include <iostream> #include <stdexcept> struct Foo { char id{'?'}; int count = std::uncaught_exceptions(); ~Foo() { count == std::uncaught_exceptions() ? std::cout << id << ".~Foo() called normally\n" : std::cout << id << ".~Foo() called during stack unwinding\n"; } }; int main() { Foo f{'f'}; try { Foo g{'g'}; std::cout << "Exception thrown\n"; throw std::runtime_error("test exception"); } catch (const std::exception& e) { std::cout << "Exception caught: " << e.what() << '\n'; } }
Mögliche Ausgabe
Exception thrown g.~Foo() called during stack unwinding Exception caught: test exception f.~Foo() called normally
[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 70 | C++98 | die Ausnahme-Spezifikation von `uncaught_exception()` fehlte | spezifiziert als `throw()` |
[bearbeiten] Siehe auch
| Funktion, die aufgerufen wird, wenn die Ausnahmebehandlung fehlschlägt (Funktion) | |
| (C++11) |
Shared-Pointer-Typ zur Handhabung von Ausnahmeobjekten (Typedef) |
| (C++11) |
erfasst die aktuelle Ausnahme in einem std::exception_ptr (Funktion) |
[bearbeiten] Externe Links
| 1. | GOTW issue 47: Uncaught Exceptions |
| 2. | Rationale for std::uncaught_exceptions (N4125) |