Модификатор noexcept в C++

Модификатор noexcept говорит компилятору что функция с данным модификатором не будет выбрасывать исключение. Это позволяет компилятору генерировать более оптимальный код.

Ответственность за то что функция с модификатором noexcept не будет выбрасывать исключение лежит целиком на программисте. Если исключение будет выброшено, то оно не будет перехвачено и программа завершится.


#include <iostream> // cout
#include <exception> // set_terminate()

void exc(){ // Функция выбрасывает исключение
    throw 1;
}

void noexc() noexcept{ // Функция выбрасывает исключение, но не должна этого делать т.к. помечена noexcept
    throw 1;
}

int main()
{
    //std::set_terminate([](){ std::cout << "terminate() called\n"; exit(1);}); // Можно переопределить стандартное завершение программы после выброса исключения
    try { // Вызываем функцию с ловлей исключения
        exc();
    } catch(...)
    {
        std::cout << "Catch exc!\n";
    }
    try { // Вызываем noexcept функцию с ловлей исключения. Но этого не произойдет - программа завершится
        noexc();
    } catch(...)
    {   // Никогда не будет выполнено
        std::cout << "Catch noexc!\n";
    }
    std::cout << "end program"; // Никогда не будет выполнено
}

/* Вывод программы
Catch exc!
terminate called after throwing an instance of 'int'

или в случае раскоментирования строки 14

Catch exc!
terminate() called
*/

Однако можно кидать и ловить исключения внутри noexcept функции. Ниже приведенный код вполне корректный.


void noexc() noexcept{ // Функция выбрасывает исключение, но не должна этого делать т.к. помечена noexcept
    try{
        throw 1;
    }catch(...){
        std::cout << "catch inside \n";
    }
}
2024-07-18



Понравилась страница?
Добавить в закладки
Или поделиться!

Связанные темы

Оператор and альтернатива оператору "Логическое И" &&
Оператор and_eq - альтернатива оператору &= (Побитовое И)
asm ключевое слово С++. Включение блока кода на языке ассемблер в код С++.
auto C++, автоматическое вычисление компилятором типа переменной
bitand оператор С++ альтернативный "Побитовое И" &
bitor оператор языка С++ аналогичный "Побитовому ИЛИ" |
bool логический тип данных в С++
break оператор завершения ближайшего цикла или case в С++
case оператор С++ для выполнения блока кода при совпадении целочисленного значения в операторе switch
catch оператор С++ для ловли исключений
class ключевое слово C++ для задания класса
compl оператор C++ альтернативный "Побитовая инверсия" ~
const ключевое слово С++
consteval спецификатор С++20 указывающий что каждый вызов функции должен создавать константы времени компиляции
constexpr спецификатор С++11 означающий что значение переменной или результат работы функции должны рассчитываться на этапе компиляции
const_cast оператор приведения типов для добавления или удаления cv-квалификаторов С++
dynamic_cast С++ преобразование указателей или ссылок на объект
false C++, логическое "Ложно" C++
inline C++ вставка кода функции в месте вызова
Ключевые слова в С++
namespace С++ пространство имен
noexcept в C++
register С++ зарезервированное ключевое слово
return C++ выход из функции с возвратом результата
Выражения rvalue, lvalue, gvalue, xvalue, prvalue.
throw C++ принудительное выбрасывание исключений
true C++ логическое истинно и любое число кроме нуля
try C++ начинает блок кода в котором ловятся исключения
using C++ создание псевдонимов и импорт из пространства имен
volatile С++ запрет оптимизации объекта который может измениться извне