Назад к вопросам
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!