共用方式為


例外狀況處理的差異

結構化的例外處理和 C++ 例外處理的主要差異是 C++ 例外處理模型處理型別中的,而 c 結構化的例外處理模型處理一種類型的例外狀況 — 特別是, unsigned int。 也就是 c 的例外狀況是以識別不帶正負號的整數值,而 C++ 例外狀況由資料型別。 在 c 中引發例外狀況時,每個可能的處理常式會執行的篩選,會檢查 c 的例外狀況的內容,並決定是否要接受例外狀況,將它傳遞給某個其他處理常式,或是忽略它。 在 C++ 中,擲回例外狀況時,它可以是任何型別。

第二個不同的是 c 的結構化的例外處理模型會參照為 「 非同步的",因為第二個控制項的一般流程會發生例外狀況。 C + + 例外處理機制為完全"同步的"表示發生,只有當它們會擲回例外狀況。

如果 C++ 程式,會引發 c 的例外狀況,它可以處理其關聯的篩選器的結構化的例外處理常式或 C++ 攔截處理常式中,無論哪個都是以動態方式靠近例外狀況的內容。 例如,下列的 C++ 程式會引發 c 的例外狀況,在 C++ 內容:

範例

// exceptions_Exception_Handling_Differences.cpp
// compile with: /EHa
#include <iostream>

using namespace std;
void SEHFunc( void );

int main() {
   try {
      SEHFunc();
   }
   catch( ... ) {
      cout << "Caught a C exception."<< endl;
   }
}

void SEHFunc() {
   __try {
      int x, y = 0;
      x = 5 / y;
   }
   __finally {
      cout << "In finally." << endl;
   }
}
      

例如,下列程式碼會安裝自訂的轉譯功能,而再引發 c 的例外狀況的包裝SE_Exception類別:

// exceptions_Exception_Handling_Differences3.cpp
// compile with: /EHa
#include <stdio.h>
#include <eh.h>
#include <windows.h>

class SE_Exception {
private:
   SE_Exception() {}
   unsigned int nSE;

public:
   SE_Exception( SE_Exception& e) : nSE(e.nSE) {}
   SE_Exception(unsigned int n) : nSE(n) {}
   ~SE_Exception() {}
   unsigned int getSeNumber() { return nSE; }
};

void SEFunc() {
   __try {
      int x, y = 0;
      x = 5 / y;
    }
    __finally {
      printf_s( "In finally\n" );
   }
}

void trans_func( unsigned int u, _EXCEPTION_POINTERS* pExp ) {
   printf_s( "In trans_func.\n" );
   throw SE_Exception( u );
}

int main() {
   _set_se_translator( trans_func );
    try {
      SEFunc();
    }
    catch( SE_Exception e ) {
      printf_s( "Caught a __try exception with SE_Exception.\n" );
      printf_s( "nSE = 0x%x\n", e.getSeNumber() );
    }
}
        

C 的例外狀況的包裝函式類別

如以上所述的簡單範例,在 c 可以被攔截的例外狀況只省略符號 ( ...]) 攔截處理常式。 沒有相關的型別或性質的例外狀況資訊傳遞給這個處理常式。 雖然這個方法可行,在某些情況下您可能需要定義兩個例外處理模型之間的轉換,讓每個 c 的例外狀況是與特定類別相關聯。 若要這樣做,您可以定義 c 的例外狀況種 「 包裝紙 」 類別,可以使用或衍生自以屬性為特定的類別型別 c 的例外狀況。 如此一來,每個 c 的例外狀況可以由 C++ 攔截處理常式比以分別前面的範例。

您的包裝函式類別可能包含的某些成員函式可用來判斷例外狀況,值,並可存取 c 的例外狀況模型所提供的延伸的例外狀況內容資訊的介面。 您也可以定義預設建構函式和建構函式可接受unsigned int引數 (提供的基礎的 c 的例外狀況表示),和一個位元的複製建構函式。 下面是可能的實作的包裝函式 c 的例外狀況類別:

// exceptions_Exception_Handling_Differences2.cpp
// compile with: /c
class SE_Exception {
private:
   SE_Exception() {}
   SE_Exception( SE_Exception& ) {}
   unsigned int nSE;
public:
   SE_Exception( unsigned int n ) : nSE( n ) {}
   ~SE_Exception() {}
   unsigned int getSeNumber() {
      return nSE;
   }
};

若要使用這個類別,您可以安裝自訂 c 的例外狀況轉譯函式所呼叫的內部例外處理機制 c 的例外狀況發生時每一次。 在您的轉譯功能,您可以擲回任何型別例外狀況 (或許SE_Exception型別或類別型別衍生自SE_Exception),可以適當的符合 C++ 所捕捉到攔截處理常式。 轉譯函式可以只傳回,表示它並未處理例外狀況。 如果轉換函式本身中引發 c 的例外狀況, 終止呼叫。

若要指定自訂的轉換函式,呼叫 _set_se_translator 您做為單一引數的轉換函式名稱的函式。 您撰寫轉換函式呼叫一次,每個函式引動過程已經在堆疊上的區塊。 沒有預設的轉換函式。 如果您未指定的話,藉由呼叫**_set_se_translator**,省略符號可以只會攔截 c 的例外狀況攔截處理常式。

請參閱

參考

混合 (結構化) 的 c 和 C++ 例外狀況