Поделиться через


Предупреждение компилятора (уровень 1) C4297

function: ожидается, что функция не будет выдавать исключения, но она это делает

Объявление функции содержит (возможно, неявный) noexcept описатель, пустой throw описатель исключений или атрибут __declspec(nothrow), а определение содержит одну или несколько инструкций создания . Чтобы устранить ошибку C4297, не пытайтесь вызвать исключения в функциях, которые объявлены как __declspec(nothrow), noexcept(true) или throw(). Кроме того, можно удалить спецификацию noexcept, throw() или __declspec(nothrow).

По умолчанию компилятор создает неявные описатели noexcept(true) для определяемых пользователем деструкторов и функций deallocator, а также созданных компилятором специальных функций-членов. Это соответствует стандарту ISO C++ 11. Чтобы предотвратить создание неявных описателей noexcept и вернуть компилятор к нестандартному поведению Visual Studio 2013, используйте параметр компилятора /Zc:implicitNoexcept- компилятора. Дополнительные сведения см. в разделе /Zc:implicitNoexcept (неявные описатели исключений).

Дополнительные сведения о спецификациях исключений см. в статьях "Спецификации исключений " (throw)". Кроме того, см. раздел /EH (модель обработки исключений) для получения сведений об изменении поведения обработки исключений во время компиляции.

Это предупреждение также создается для функций __declspec(dllexport), помеченных как экстерн "C", даже если они являются функциями C++.

Следующий пример приводит к возникновению ошибки C4297.

// C4297.cpp
// compile with: /W1 /LD
void __declspec(nothrow) f1()   // declared nothrow
// try the following line instead
// void f1()
{
   throw 1;   // C4297
}