std::uncaught_exception, std::uncaught_exceptions
| Definiert im Header <exception>
|
||
bool uncaught_exception() throw();
|
(1) | (bis C++11) |
bool uncaught_exception() noexcept;
|
(seit C++11) (veraltet in C++17) (entfernt in C++20) |
|
int uncaught_exceptions() noexcept;
|
(2) | (seit C++17) (constexpr seit C++26) |
std::uncaught_exception erkennt, ob zurzeit Stack-Entwicklung im Gange ist.Manchmal ist es sicher, eine Ausnahme zu werfen, selbst während std::uncaught_exception() == true(bis C++17) std::uncaught_exceptions() > 0(seit C++17). Wenn zum Beispiel Stack-Entwicklung 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.
Rückgabewert
true , wenn die Stack-Entwicklung in diesem Thread gerade im Gange ist, andernfalls false .Anmerkungen
Ein Beispiel, wo die int-zurückgebende uncaught_exceptions verwendet wird, ist die boost.log-Bibliothek: Der Ausdruck BOOST_LOG(logger) << foo(); erstellt zuerst ein Guard-Objekt und zeichnet die Anzahl der nicht gefangenen Ausnahmen in seinem Konstruktor auf. Die Ausgabe erfolgt durch den Destruktor des Guard-Objekts, es sei denn, foo() wirft (in diesem Fall ist die Anzahl der nicht gefangenen Ausnahmen im Destruktor größer als die, die der Konstruktor beobachtet hat).
std::experimental::scope_fail und std::experimental::scope_success in LFTS v3 verlassen sich auf die Funktionalität von uncaught_exceptions, da ihre Destruktoren unterschiedliche Aktionen ausführen müssen, je nachdem, ob sie während der Stack-Entwicklung 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 Ausnahmetypen
|
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
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewandt auf | Verhalten wie veröffentlicht | Richtiges Verhalten |
|---|---|---|---|
| LWG 70 | C++98 | die Ausnahmespezifikation von uncaught_exception() fehlte
|
spezifiziert als throw()
|
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 einer std::exception_ptr (Funktion) |
Externe Links
| 1. | GOTW Ausgabe 47: Uncaught Exceptions |
| 2. | Begründung für std::uncaught_exceptions (N4125)
|