Ostrzeżenie kompilatora (poziom 1) C4297

"function": zakładano, że funkcja nie zgłasza wyjątku, ale nie

Deklaracja funkcji zawiera (prawdopodobnie niejawny) noexcept specyfikator, pusty throw specyfikator wyjątku lub atrybut __declspec(nothrow), a definicja zawiera co najmniej jedną instrukcję throw . Aby rozwiązać problem C4297, nie należy próbować zgłaszać wyjątków w funkcjach, które są zadeklarowane __declspec(nothrow), noexcept(true) lub throw(). Możesz też usunąć specyfikację noexcept, throw()lub __declspec(nothrow) .

Domyślnie kompilator generuje niejawne noexcept(true) specyfikatory dla funkcji destruktorów zdefiniowanych przez użytkownika i funkcji cofania przydziału oraz specjalnych funkcji składowych generowanych przez kompilator. Jest to zgodne ze standardem ISO C++11. Aby zapobiec generowaniu niejawnych specyfikatorów noexcept i przywrócić kompilator do nietypowego zachowania programu Visual Studio 2013, użyj opcji /Zc:implicitNoexcept- kompilatora. Aby uzyskać więcej informacji, zobacz /Zc:implicitNoexcept (niejawne specyfikatory wyjątków).

Aby uzyskać więcej informacji na temat specyfikacji wyjątków, zobacz Specyfikacje wyjątków (throw). Zobacz też /EH (Model obsługi wyjątków), aby uzyskać informacje na temat modyfikowania zachowania obsługi wyjątków w czasie kompilacji.

To ostrzeżenie jest również generowane dla funkcji __declspec(dllexport) oznaczonych jako extern "C", nawet jeśli są to funkcje języka C++.

Poniższy przykład generuje C4297:

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