Share via


混合 C (結構化) 和 C++ 例外狀況

如果您想要撰寫可攜式程式碼,不建議在 C++ 程式中使用結構化例外狀況處理 (SEH)。 不過,您有時可能會想要使用 /EHa 和 混合結構化例外狀況和 C++ 原始程式碼進行編譯,而且需要一些處理這兩種例外狀況的設施。 因為結構化例外狀況處理常式沒有物件或具型別例外狀況的概念,所以無法處理 C++ 程式碼擲回的例外狀況。 不過,C++ catch 處理常式可以處理結構化例外狀況。 C++ 例外狀況處理語法 ( trythrowcatch ) 不接受 C 編譯器,但 C++ 編譯器支援結構化例外狀況處理語法 ( __try__except__finally ) 。

如需如何將結構化例外狀況當作 C++ 例外狀況處理的資訊,請參閱 _set_se_translator

如果您混合結構化和 C++ 例外狀況,請注意下列潛在問題:

  • C++ 例外狀況和結構化例外狀況無法在相同的函式中混合。

  • 終止處理常式( __finally 區塊)一律會執行,即使在擲回例外狀況之後的回溯期間也一樣。

  • C++ 例外狀況處理可以在使用 /EH 編譯器選項編譯的所有模組中攔截並保留回溯語意,以啟用回溯語意。

  • 在某些情況下,並非所有物件都呼叫解構函式。 例如,嘗試透過未初始化的函式指標進行函式呼叫時,可能會發生結構化例外狀況。 如果函式參數是在呼叫之前建構的物件,則這些物件的解構函式不會在堆疊回溯期間呼叫。

下一步

另請參閱

例外狀況和錯誤處理的新式 C++ 最佳做法