首頁  >  文章  >  後端開發  >  何時以及為何應在 C 中使用 __try 關鍵字?

何時以及為何應在 C 中使用 __try 關鍵字?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-06 13:16:02719瀏覽

When and Why Should You Utilize the __try Keyword in C  ?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn