編譯器警告 (層級 1) C4297

'function' : 函式預設並不會擲回例外狀況,但卻擲回例外狀況

函式宣告包含 (可能隱含的) noexcept 規範、空 throw 的例外狀況規範或 __declspec(nothrow) 屬性,而定義包含一或多個 throw 語句。 若要解決 C4297,請勿嘗試在宣告 __declspec(nothrow)noexcept(true)throw() 的函式中擲回例外狀況。 或者,移除 noexceptthrow()__declspec(nothrow) 規格。

根據預設,編譯器會為使用者定義的解構函式和取消配置函式和編譯器所產生的特殊成員函式產生隱含 noexcept(true) 規範。 這會符合 ISO C++11 標準。 若要防止產生隱含 noexcept 規範,並將編譯器還原為 Visual Studio 2013 的非標準行為,請使用 /Zc:implicitNoexcept- 編譯器選項。 如需詳細資訊,請參閱 /Zc:implicitNoexcept (隱含例外狀況規範)。

如需例外狀況規格的詳細資訊,請參閱 例外狀況規格(throw)。 此外,如需如何在編譯時期修改例外狀況處理行為的資訊,請參閱 /EH (例外狀況處理模型 )。

即使它們是 C++ 函式,也會針對標示為 extern 「C」 的 __declspec( dllexport ) 函式產生這個警告。

下列範例會產生 C4297:

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