共用方式為


編譯器錯誤 C2712

無法在需要物件回溯的函式中使用__try

備註

如果您使用 /EHsc時,可能會發生錯誤 C2712,且具有結構化例外狀況處理的函式也有需要回溯的物件(解構)。

可能的解決方案:

  • 將需要 SEH 的程式碼移至另一個函式

  • 重寫使用 SEH 的函式,以避免使用具有解構函式的本機變數和參數。 請勿在建構函式或解構函式中使用 SEH

  • 編譯時不要使用 /EHsc

如果您使用 關鍵詞呼叫宣告 __event 的方法,也可能會發生錯誤 C2712。 因為事件可能會在多線程環境中使用,編譯程式會產生程序代碼,以防止操作基礎事件對象,然後將產生的程式碼括在 SEH try-finally 語句中。 因此,如果您呼叫事件方法,並以類型具有解構函式的引數傳值,就會發生錯誤 C2712。 此情況下的解決方案之一,是傳遞引數做為常數參考。

如果您使用 編譯 /clr:pure ,並在區塊中 __try 宣告指針對函式的靜態陣列,也可能會發生 C2712。 靜態成員需要編譯程式使用 下的 /clr:pure動態初始化,這表示C++例外狀況處理。 然而,在 __try 區塊中不允許執行 C++ 例外狀況處理。

/clr:pure/clr:safe 編譯器選項在 Visual Studio 2015 中已淘汰,且 Visual Studio 2017 已不支援此選項。

範例

下列範例會產生 C2712,並說明如何加以修正。

// C2712.cpp
// compile with: /clr:pure /c
struct S1 {
   static int smf();
   void fnc();
};

void S1::fnc() {
   __try {
      static int (*array_1[])() = {smf,};   // C2712

      // OK
      static int (*array_2[2])();
      array_2[0] = smf;
    }
    __except(0) {}
}