首頁 >後端開發 >C++ >在 C 中什麼時候應該使用 __try 而不是 try/catch/finally ?

在 C 中什麼時候應該使用 __try 而不是 try/catch/finally ?

DDD
DDD原創
2024-11-11 13:58:02575瀏覽

When Should You Use __try Instead of try/catch/finally in C  ?

C 的異常:__try 與try/catch/finally

在C 中,try/catch/finally 結構用於處理例外情況。但是,它們也可能會遇到下劃線,例如 __try。這就提出了何時需要這些底線的問題。

在 Windows 平台上:統一異常處理

在 Windows 上,透過結構化異常在作業系統層級支援異常處理(SEH)。它們與 Unix 訊號相當。針對 Windows 的編譯器利用 SEH 來實作 C 異常。

非標準 __try 和 __ except

要處理 C 中的 SEH 異常,必須使用非標準 __try 關鍵字而不是嘗試。 __except 關鍵字與 C 的 catch 類似,但它提供了額外的功能。它允許您指定一個異常過濾表達式來確定是否應捕獲活動異常。

__finally 用於異常後程式碼執行

__finally 關鍵字可讓您處理例外狀況後執行程式碼。此功能在標準 C 中不存在,但在其他語言中很常見。

禁用析構函數呼叫的最佳化

Microsoft 編譯器執行可以阻止析構函數的最佳化在堆疊展開期間在所有情況下都不會被呼叫。如果它確定在控制物件生命週期的範圍內沒有拋出,它就會跳過註冊代碼。為了確保析構函數調用,請使用 /EHa 編譯選項來抑制此最佳化。

示範 SEH 和 C 異常處理的範例

為了說明這些概念,這裡有一個程式碼片段示範了 SEH 異常如何允許 C 析構函式呼叫以及 C異常如何建構在SEH:

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

輸出:

Filtering c0000005
destructed
caught
Filtering e06d7363
destructed
caught

此範例展示了SEH 和C 異常的處理,展示了即使在SEH 異常期間如何呼叫析構函數。

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

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