Namespaces
Variants

std::uncaught_exception, std::uncaught_exceptions

Von de.cppreference.net
 
 
 
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)
1) Erkennt, ob der aktuelle Thread ein aktives Ausnahmeobjekt hat, d.h. eine Ausnahme wurde geworfen oder erneut geworfen und hat noch keinen passenden catch-Block, std::terminate oder std::unexpected erreicht. Mit anderen Worten: std::uncaught_exception erkennt, ob zurzeit Stack-Entwicklung im Gange ist.
2) Erkennt, wie viele Ausnahmen im aktuellen Thread geworfen oder erneut geworfen wurden und noch nicht ihre passenden catch-Blöcke erreicht haben.

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

1) true , wenn die Stack-Entwicklung in diesem Thread gerade im Gange ist, andernfalls false .
2) Die Anzahl der nicht gefangenen Ausnahmeobjekte im aktuellen Thread.

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)
Shared-Pointer-Typ zur Handhabung von Ausnahmeobjekten
(typedef)
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)