混合 C (結構化) 和 C++ 例外狀況
如果您想要撰寫可攜式程式碼,不建議在 C++ 程式中使用結構化例外狀況處理 (SEH)。 不過,您有時可能會想要使用 /EHa
和 混合結構化例外狀況和 C++ 原始程式碼進行編譯,而且需要一些處理這兩種例外狀況的設施。 因為結構化例外狀況處理常式沒有物件或具型別例外狀況的概念,所以無法處理 C++ 程式碼擲回的例外狀況。 不過,C++ catch
處理常式可以處理結構化例外狀況。 C++ 例外狀況處理語法 ( try
、 throw
、 catch
) 不接受 C 編譯器,但 C++ 編譯器支援結構化例外狀況處理語法 ( __try
、 __except
、 __finally
) 。
如需如何將結構化例外狀況當作 C++ 例外狀況處理的資訊,請參閱 _set_se_translator
。
如果您混合結構化和 C++ 例外狀況,請注意下列潛在問題:
C++ 例外狀況和結構化例外狀況無法在相同的函式中混合。
終止處理常式(
__finally
區塊)一律會執行,即使在擲回例外狀況之後的回溯期間也一樣。C++ 例外狀況處理可以在使用
/EH
編譯器選項編譯的所有模組中攔截並保留回溯語意,以啟用回溯語意。在某些情況下,並非所有物件都呼叫解構函式。 例如,嘗試透過未初始化的函式指標進行函式呼叫時,可能會發生結構化例外狀況。 如果函式參數是在呼叫之前建構的物件,則這些物件的解構函式不會在堆疊回溯期間呼叫。
下一步
-
如需使用
setjmp
和longjmp
在 C++ 程式中的詳細資訊,請參閱 。 -
請參閱使用 C++ 來處理結構化例外狀況的方法範例。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應