C異常(C structured exception)只能處理一種類型(unsigned int),C++異常(C++ exception)處理很多類型。C異常根據無符號整型的值來標識,而C++異常是根據數據類型來標識的。當在C程序中引發了異常後,每一個能處理者都去檢查異常內容來決定是自己處理還是交給其他處理者,或者是忽略。在C++程序中異常被拋出後,它有可能是任何一種類型。
C異常處理模式是“異步”,當異常發生後會向下繼續執行的。C++異常處理模式是“同步”,異常發生時就是異常拋出時!
在C++程序中引發C異常後,能被C的結構化異常者處理或者被C++ catch中的處理者處理。
下面這例子:在C++程序引發了C的異常。
[cpp] view plaincopyprint?
// 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;
}
}
程序結果:
In finally.
Caught a C exception.
下面這個例子是如何將C異常包裝成C++異常
[cpp] view plaincopyprint?
// 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() );
}
}
程序結果:
In trans_func.
In finally
Caught a __try exception with SE_Exception.
nSE = 0xc0000094
綜上,C異常僅能被try{}catch(...){}來捕獲處理,但是並沒有關於異常類型和內容的說明,為了異常更清楚,可以將C異常包裝成C++異常(上述例子)。
MSDN相關解釋