Namensräume
Varianten
Aktionen

std::uncaught_exception, std::uncaught_exceptions

Von cppreference.com
< cpp‎ | error
 
 
 
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)
1) Stellt fest, ob im aktuellen Thread ein aktives Ausnahmeobjekt vorhanden ist, d.h. eine Ausnahme wurde geworfen oder erneut geworfen und noch kein passender Catch-Block betreten, std::terminate oder std::unexpected. Mit anderen Worten, std::uncaught_exception stellt fest, ob Stack Unwinding gerade stattfindet.
2) Stellt fest, wie viele Ausnahmen im aktuellen Thread geworfen oder erneut geworfen wurden und noch nicht ihre passenden Catch-Blöcke betreten haben.

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

1) true, wenn Stack Unwinding in diesem Thread gerade stattfindet, andernfalls false.
2) Die Anzahl der nicht abgefangenen Ausnahmeobjekte im aktuellen Thread.

[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) [bearbeiten]
Shared-Pointer-Typ zur Handhabung von Ausnahmeobjekten
(Typedef) [bearbeiten]
erfasst die aktuelle Ausnahme in einem std::exception_ptr
(Funktion) [bearbeiten]

[bearbeiten] Externe Links

1.  GOTW issue 47: Uncaught Exceptions
2.  Rationale for std::uncaught_exceptions (N4125)