Может ли функция, помеченная как noexcept, иметь внутри исключения?

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

void MyFunc() noexcept
{
    try {
        throw std::exception("...");
    } catch (const std::exception & e) {
        // I'll deal with it here...
    }
}

person SLC    schedule 10.03.2015    source источник


Ответы (2)


Да, это совершенно законно, пока исключение не просачивается из функции.

Реализация не должна отклонять выражение только потому, что при выполнении оно выдает или может выдать исключение, которое не допускает содержащая его функция.

[кроме .spec/11 в С++ 11]

person Brian Bi    schedule 10.03.2015
comment
Ваш ответ правильный, но ваша цитата относится к void MyFunc() noexcept { throw std::exception("..."); } (без try/catch) и просто указывает, что компилятор не должен ее отклонять, она не распространяется на то, как обрабатывается исключение во время выполнения. - person ; 11.03.2015

Поиск обработчика исключений выполняется изнутри наружу, поиск на один уровень ниже, если ничего не найдено для обработки исключения.

15.3 Обработка исключения [except.handle]

4. Обработчики блока try проверяются в порядке их появления. [...]

[...]

6. Если среди обработчиков блока try совпадений не обнаружено, поиск соответствующего обработчика продолжается в динамически окружающем блоке try того же потока.

15.4 Спецификации исключений [except.spec]

9 Всякий раз, когда возникает исключение и поиск обработчика (15.3) обнаруживает самый внешний блок функции с спецификацией исключения, которая не разрешает исключение, тогда

[... std::unexpected() или std::terminate() называется. ]

Единственный случай, когда noexcept(true) имеет видимый эффект, — это если внутри функции возникает исключение, а соответствующий обработчик отсутствует. Для исключения с соответствующим обработчиком не указан специальный эффект, поэтому он должен работать так же, как и в функции noexcept(false).

person Community    schedule 10.03.2015