C Try/Catch/Finally 區塊和__try 關鍵字
結構化例外處理(SEH) 是作業系統層級的例外處理機制Windows 支援。 Windows 編譯器通常會利用 SEH 來實作 C 異常。
雖然 C 關鍵字 throw 和 catch 專門處理 C 異常,但 Microsoft Visual C (MSVC) 編譯器提供非標準 __try 和 __ except 關鍵字來處理 SEH 異常。
__try 區塊:
非標準 __try 區塊定義了可能發生異常的範圍,就像 C 中的 try 區塊一樣。接下來是 __except 和 __finally 區塊。
__ except 區塊:
__ except 區塊類似於 C 中的 catch 區塊,但提供了更大的靈活性。它有一個異常過濾表達式,用於評估是否應處理活動異常。
__finally 區塊:
__finally 區塊包含在任何異常處理後執行的程式碼。它類似於 C# 中的 finally 區塊,但在標準 C 中並不直接等效。
__try 區塊的用例:
SEH 異常可以包含由操作產生的異常系統、使用SEH 的互通程式碼或使用「.NET」異常碼的託管代碼。若要在 C 中擷取這些異常,必須將 __try 區塊與 __except 區塊一起使用。
範例程式:
範例程式示範了 SEH 異常以及如何使用 C 析構函數在 SEH 異常展開期間呼叫。
#include <windows.h> #include <iostream> class Example { public: ~Example() { std::cout << "destructed" << std::endl; } }; int filterException(int code, PEXCEPTION_POINTERS ex) { std::cout << "Filtering " << std::hex << code << std::endl; return EXCEPTION_EXECUTE_HANDLER; } int main() { __try { Example e; int* p = 0; *p = 42; // intentially generating a processor fault } __except (filterException(GetExceptionCode(), GetExceptionInformation())) { std::cout << "caught" << std::endl; } return 0; }
輸出:
Filtering c0000005 destructed caught
以上是何時以及為何應在 C 中使用 __try 關鍵字?的詳細內容。更多資訊請關注PHP中文網其他相關文章!