Share via


編譯器警告 (層級 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
}