Назад к вопросам
Middle+
80
questionbank
Что произойдет, если в функции, помеченной как noexcept, будет выброшено исключение?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Произойдет вызов std::terminate. При этом стандарт гарантирует, что перед вызовом std::terminate будет вызван std::unexpected в C++17 и более ранних версиях, но в C++20 это поведение удалено. Таким образом, в современных стандартах (C++20 и выше) при выбросе исключения из функции, помеченной noexcept, происходит немедленный вызов std::terminate.
По умолчанию std::terminate вызывает abort. Поведение std::terminate может быть изменено вызовом std::set_terminate.
Пример:
#include <iostream>
#include <exception>
void my_terminate_handler() {
std::cerr << "Custom terminate handler called!\n";
std::abort(); // Можно вызвать abort или exit
}
void function_noexcept() noexcept {
std::cout << "Inside noexcept function. Throwing exception...\n";
throw std::runtime_error("Something went wrong!"); // Выброс исключения
std::cout << "This line will not be reached.\n";
}
int main() {
std::set_terminate(my_terminate_handler); // Устанавливаем свой обработчик terminate
try {
function_noexcept();
} catch (...) {
// Этот блок catch не будет выполнен, потому что исключение из noexcept
// приводит к вызову terminate напрямую.
std::cerr << "Caught an exception (this should not happen for noexcept).\n";
}
std::cout << "End of main (should not be reached).\n";
return 0; // Этот return не будет достигнут, так как main завершится через terminate/abort
}
Вывод программы будет примерно таким:
Inside noexcept function. Throwing exception...
Custom terminate handler called!