Namensräume
Varianten
Aktionen

std::current_exception

Von cppreference.com
< cpp‎ | error
 
 
 
Definiert in Header <exception>
std::exception_ptr current_exception() noexcept;
(seit C++11)
(constexpr seit C++26)

Wenn während der Ausnahmebehandlung (typischerweise in einer catch-Klausel) aufgerufen, erfasst das aktuelle Ausnahmeobjekt und erstellt einen std::exception_ptr, der entweder eine Kopie oder eine Referenz auf dieses Ausnahmeobjekt enthält (abhängig von der Implementierung). Das referenzierte Objekt bleibt mindestens so lange gültig, wie ein exception_ptr-Objekt darauf verweist.

Wenn die Implementierung dieser Funktion einen Aufruf von new erfordert und der Aufruf fehlschlägt, enthält der zurückgegebene Zeiger eine Referenz auf eine Instanz von std::bad_alloc.

Wenn die Implementierung dieser Funktion das Kopieren des erfassten Ausnahmeobjekts erfordert und sein Kopierkonstruktor eine Ausnahme auslöst, enthält der zurückgegebene Zeiger eine Referenz auf die ausgelöste Ausnahme. Wenn der Kopierkonstruktor des ausgelösten Ausnahmeobjekts ebenfalls eine Ausnahme auslöst, kann der zurückgegebene Zeiger eine Referenz auf eine Instanz von std::bad_exception enthalten, um die Endlosschleife zu unterbrechen.

Wenn die Funktion aufgerufen wird, während keine Ausnahme behandelt wird, wird ein leerer std::exception_ptr zurückgegeben.

Diese Funktion kann in einem std::terminate_handler aufgerufen werden, um die Ausnahme abzurufen, die die Ausführung von std::terminate ausgelöst hat.

Inhalt

[bearbeiten] Rückgabewert

Eine Instanz von std::exception_ptr, die eine Referenz auf das Ausnahmeobjekt, eine Kopie des Ausnahmeobjekts oder eine Referenz auf eine Instanz von std::bad_alloc oder eine Instanz von std::bad_exception enthält.

[bearbeiten] Hinweise

Bei Implementierungen, die dem Itanium C++ ABI folgen (GCC, Clang etc.), werden Ausnahmen beim Werfen auf dem Heap alloziert (außer bei std::bad_alloc in einigen Fällen), und diese Funktion erstellt einfach den Smart Pointer, der auf das zuvor alloziierte Objekt verweist. Bei MSVC werden Ausnahmen beim Werfen auf dem Stack alloziert, und diese Funktion führt die Heap-Allokation durch und kopiert das Ausnahmeobjekt.

Unter Windows in verwalteten CLR-Umgebungen [1] speichert die Implementierung eine std::bad_exception, wenn die aktuelle Ausnahme eine verwaltete Ausnahme ist ([2]). Beachten Sie, dass catch(...) auch verwaltete Ausnahmen abfängt.

#include <exception>
 
int main()
{
    try
    {
        throw gcnew System::Exception("Managed exception");
    }
    catch (...)
    {
        std::exception_ptr ex = std::current_exception();
        try
        {
            std::rethrow_exception(ex);
        }
        catch (std::bad_exception const &)
        {
            // This will be printed.
            std::cout << "Bad exception" << std::endl;
        }
    }
}
Feature-Test-Makro Wert Std Feature
__cpp_lib_constexpr_exceptions 202411L (C++26) constexpr für Ausnahme-Typen

[bearbeiten] Beispiel

#include <exception>
#include <iostream>
#include <stdexcept>
#include <string>
 
void handle_eptr(std::exception_ptr eptr) // passing by value is OK
{
    try
    {
        if (eptr)
            std::rethrow_exception(eptr);
    }
    catch(const std::exception& e)
    {
        std::cout << "Caught exception: '" << e.what() << "'\n";
    }
}
 
int main()
{
    std::exception_ptr eptr;
 
    try
    {
        [[maybe_unused]]
        char ch = std::string().at(1); // this generates a std::out_of_range
    }
    catch(...)
    {
        eptr = std::current_exception(); // capture
    }
 
    handle_eptr(eptr);
 
} // destructor for std::out_of_range called here, when the eptr is destructed

Mögliche Ausgabe

Caught exception: 'basic_string::at: __n (which is 1) >= this->size() (which is 0)'

[bearbeiten] Siehe auch

Shared-Pointer-Typ zur Handhabung von Ausnahmeobjekten
(Typedef) [bearbeiten]
wirft die Ausnahme aus einem std::exception_ptr
(Funktion) [bearbeiten]
erstellt einen std::exception_ptr aus einem Ausnahmeobjekt
(Funktionstemplate) [bearbeiten]
(in C++20* entfernt)(C++17)
prüft, ob gerade eine Ausnahmebehandlung im Gange ist
(Funktion) [bearbeiten]