Предупреждение компилятора (уровень 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
}