Namensräume
Varianten
Aktionen

std::set_terminate

Von cppreference.com
< cpp‎ | error
 
 
 
Definiert in Header <exception>
(bis C++11)
std::terminate_handler set_terminate( std::terminate_handler f ) noexcept;
(seit C++11)

Macht f zum neuen globalen Behandlungsfunktion für den Abbruch und gibt den zuvor installierten std::terminate_handler zurück. f muss die Ausführung des Programms beenden, ohne an seinen Aufrufer zurückzukehren, andernfalls ist das Verhalten undefiniert.

Diese Funktion ist Thread-sicher. Jeder Aufruf von std::set_terminate synchronisiert mit (siehe std::memory_order) nachfolgenden Aufrufen von std::set_terminate und std::get_terminate.

(seit C++11)

Inhalt

[bearbeiten] Parameter

f - Zeiger auf eine Funktion vom Typ std::terminate_handler oder ein Nullzeiger

[bearbeiten] Rückgabewert

Der zuvor installierte Behandlungsfunktion für den Abbruch oder ein Nullzeigerwert, wenn keiner installiert war.

[bearbeiten] Beispiel

#include <cstdlib>
#include <exception>
#include <iostream>
 
int main()
{
    std::set_terminate([]()
    {
        std::cout << "Unhandled exception\n" << std::flush;
        std::abort();
    });
    throw 1;
}

Mögliche Ausgabe

Unhandled exception
bash: line 7:  7743 Aborted                 (core dumped) ./a.out

Die Behandlungsfunktion für den Abbruch funktioniert auch für gestartete Threads, sodass sie als Alternative zur Einkapselung der Thread-Funktion mit einem try/catch-Block verwendet werden kann. Im folgenden Beispiel wird, da die Ausnahme unbehandelt ist, std::terminate aufgerufen.

#include <iostream>
#include <thread>
 
void run()
{
    throw std::runtime_error("Thread failure");
}
 
int main()
{
    try
    {
        std::thread t{run};
        t.join();
        return EXIT_SUCCESS;
    }
    catch (const std::exception& ex)
    {
        std::cerr << "Exception: " << ex.what() << '\n';
    }
    catch (...)
    {
        std::cerr << "Unknown exception caught\n";
    }
    return EXIT_FAILURE;
}

Mögliche Ausgabe

terminate called after throwing an instance of 'std::runtime_error'
  what():  Thread failure
Aborted (core dumped)

Mit der Einführung der Behandlungsfunktion für den Abbruch kann die von einem Nicht-Hauptthread geworfene Ausnahme analysiert und der Abbruch ordnungsgemäß durchgeführt werden.

#include <iostream>
#include <thread>
 
class foo
{
public:
    foo() { std::cerr << "foo::foo()\n"; }
    ~foo() { std::cerr << "foo::~foo()\n"; }
};
 
// Static object, expecting destructor on exit
foo f;
 
void run()
{
    throw std::runtime_error("Thread failure");
}
 
int main()
{
    std::set_terminate([]()
    {
        try
        {
            std::exception_ptr eptr{std::current_exception()};
            if (eptr)
            {
                std::rethrow_exception(eptr);
            }
            else
            {
                std::cerr << "Exiting without exception\n";
            }
        }
        catch (const std::exception& ex)
        {
            std::cerr << "Exception: " << ex.what() << '\n';
        }
        catch (...)
        {
            std::cerr << "Unknown exception caught\n";
        }
        std::exit(EXIT_FAILURE);
    });
 
    std::thread t{run};
    t.join();
}

Ausgabe

foo::foo()
Exception: Thread failure
foo::~foo()

[bearbeiten] Siehe auch

Funktion, die aufgerufen wird, wenn die Ausnahmebehandlung fehlschlägt
(Funktion) [bearbeiten]
holt den aktuellen terminate_handler
(Funktion) [bearbeiten]
der Typ der Funktion, die von std::terminate aufgerufen wird
(Typedef) [bearbeiten]