首頁  >  文章  >  後端開發  >  在 C 語言中什麼時候應該使用 `__try` 和 `__ except` 而不是 `try` 和 `catch` ?

在 C 語言中什麼時候應該使用 `__try` 和 `__ except` 而不是 `try` 和 `catch` ?

DDD
DDD原創
2024-11-07 22:22:03373瀏覽

When Should You Use `__try` and `__except` Instead of `try` and `catch` in C  ?

C 中的 __try 和 try/catch/finally

C 中,異常處理主要透過 try/catch/finally 區塊實現。但是,還有一些鮮為人知的命令以雙下劃線開頭,例如 __try。本文旨在闡明何時需要使用這些底線。

在 Windows 系統上,透過結構化異常處理 (SEH)(一種作業系統層級機制)支援異常。編譯器通常利用此 SEH 基礎結構來實作 C 異常。 throw 和 catch 關鍵字僅處理 C 異常,其對應的 SEH 異常代碼為 0xe06d7363。

為了處理 SEH 異常,C 程式需要使用非標準 __try 關鍵字。此外,__except 與 catch 類似,但允許指定異常過濾器來確定是否應處理活動異常。 __finally 在異常處理後啟用程式碼執行。

為了說明這些概念,請考慮下面的範例程式:

#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;
}

void testProcessorFault() {
    Example e;
    int* p = 0;
    *p = 42;
}

void testCppException() {
    Example e;
    throw 42;
}

int main()
{
    __try {
        testProcessorFault();
    }
    __except(filterException(GetExceptionCode(), GetExceptionInformation())) {
        std::cout << "caught" << std::endl;
    }
    __try {
        testCppException();
    }
    __except(filterException(GetExceptionCode(), GetExceptionInformation())) {
        std::cout << "caught" << std::endl;
    }
    return 0;
}

以上是在 C 語言中什麼時候應該使用 `__try` 和 `__ except` 而不是 `try` 和 `catch` ?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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