Page 1 of 1

Was ist der Ersatz für den veralteten std::unexpected_handler? [geschlossen]

Posted: 12 Jan 2025, 02:51
by Guest
Laut cppreference ist std::unexpected_handler in C++11 veraltet und in C++17 entfernt. Das Gleiche gilt für verwandte Funktionen std::unexpected, std::set_unexpected, std::get_unexpected. Mir ist aufgefallen, dass einige davon in der Frage „Was ist der Unterschied zwischen der Deklaration einer Funktion als __attribute__(nothrow) und „throw()““ erwähnt wurden, aber seit dieser Frage hat sich viel geändert.
Was ist der Grund für die Entfernung dieser Funktionen? Wie kann ich sie nach dem Upgrade auf C++17 ersetzen?

Code: Select all

// function that throws exception that is not specified
void foo() throw(std::logic_error) {
throw std::runtime_error();
}

// function that throws exceptions, but no are specified
void bar() throw() {
throw std::runtime_error();
}

void handler() {
...
}

int main() {
std::set_unexpected(handler);
...
}
Bearbeiten
Um ein ähnliches Verhalten zu erreichen, kann std::unexpected_handler durch std ersetzt werden: :terminate_handler. Auf diese Weise wird derselbe Handler für
aufgerufen

Code: Select all

// dynamic exception specification is not valid int C++17, so it is removed
void foo() {
throw std::runtime_error();
}

// throw() is replaced with noexcept
void bar() noexcept {
throw std::terminate_handler();
}

void handler() {
...
}

int main() {
std::terminate_handler(handler);
...
}