首頁  >  文章  >  後端開發  >  C 中的結構化異常處理 (SEH) 如何與 __try 和 try/catch/finally 一起工作?

C 中的結構化異常處理 (SEH) 如何與 __try 和 try/catch/finally 一起工作?

Barbara Streisand
Barbara Streisand原創
2024-11-07 13:11:03390瀏覽

How Does Structured Exception Handling (SEH) Work in C   with __try and try/catch/finally?

C 中的結構化異常處理(SEH),使用__try 和try/catch/finally

在C 中,try/ catch/finally 區塊提供一個處理程式碼區塊內異常的機制。但是,在 Windows 上,編譯器也支援另一種稱為結構化異常處理 (SEH) 的方法。

__try 關鍵字是一個非標準關鍵字,可讓您擷取 SEH 異常。 SEH 異常在作業系統層級受到支持,提供了一種從作業系統本身或從使用 SEH 進行異常處理的程式碼捕獲異常的方法。

__except 關鍵字可讓您指定一個異常過濾表達式,用於確定是否或不應該捕獲活動的異常。這允許您選擇性地處理某些類型的異常。

__finally 關鍵字可讓您新增在處理例外狀況後執行的程式碼。這對於執行清理操作非常有用,例如釋放資源或關閉檔案。

SEH 異常是在 C 異常之上實現的。 C 異常是使用 throw 關鍵字引發的,並且可以使用 catch 關鍵字捕獲。當拋出 C 異常時,編譯器會建立對應的 SEH 異常,該異常可以被 __try/__except 區塊捕獲。

EHa 編譯選項強制編譯器總是產生程式碼來註冊所建立物件的析構函式在 try 區塊的範圍內。這確保即使在存在非同步 SEH 異常的情況下也會呼叫析構函數。

為了示範如何在C 中擷取SEH 異常,請考慮以下程式:

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

當您執行此程式時設定了EHa 編譯選項的程序,輸出將顯示呼叫了Example物件的析構函數,即使引發SEH 異常也是如此。這示範如何在 C 程式碼中一起處理 SEH 異常和 C 異常。

以上是C 中的結構化異常處理 (SEH) 如何與 __try 和 try/catch/finally 一起工作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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