例外狀況處理的差異
結構化的例外處理和 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 的例外狀況攔截處理常式。