編譯器警告 (層級 4) C4571
資訊:
catch(...)
自 Visual C++ 7.1 以來,語意已變更;已不再攔截結構化例外狀況 (SEH)
當您指定 /EHs
編譯器選項時,會 catch(...)
為每個區塊產生 C4571。
備註
當您指定 /EHs
編譯器選項時, catch(...)
區塊不會攔截結構化例外狀況。 (例如,除以零或 Null 指標例外狀況。區塊 catch(...)
只會攔截明確擲回的 C++ 例外狀況。 如需詳細資訊,請參閱例外狀況處理。
此警告預設為關閉。 開啟此警告,以確保當您使用 /EHs
區塊 catch (...)
進行編譯時,不會攔截結構化例外狀況。 如需詳細資訊,請參閱 預設 關閉的編譯器警告。
您可以使用下列其中一種方式來解決 C4571:
/EHa
如果您仍然希望區塊catch(...)
攔截結構化例外狀況,請使用 編譯 。如果您不想
catch(...)
讓區塊攔截結構化例外狀況,但仍想要使用catch(...)
區塊,請勿啟用 C4571。 您仍然可以使用結構化例外狀況處理關鍵字 (__try
、__except
和__finally
) 攔截結構化例外狀況。 但請記住,使用 編譯/EHs
時,只有在擲回 C++ 例外狀況時,才會呼叫解構函式,而不是發生 SEH 例外狀況時。將
catch(...)
區塊取代為特定 C++ 例外狀況的 catch 區塊,並選擇性地在 C++ 例外狀況處理周圍新增結構化例外狀況處理 (__try
、__except
和__finally
)。 如需詳細資訊,請參閱 結構化例外狀況處理 (C/C++) 和/EH
(例外狀況處理模型)。
範例
下列範例會產生 C4571。
// C4571.cpp
// compile with: /EHs /W4 /c
#pragma warning(default : 4571)
int main() {
try {
int i = 0, j = 1;
j /= i; // this will throw a SE (divide by zero)
}
catch(...) {} // C4571 warning
}
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應