文章目錄
- 先來一個簡單的例子
- 來一個真正意義上的 C++ 程式,且使用 SEH 機制
- 總結
轉載自http://blog.programfan.com/article.asp?id=9864
首先聲明的是, C++ 中的異常處理機制是建立在 Windows 平台上的 SEH 機制之上,所以 SEH 當然可以在 C++ 程式中使用。不過“阿愚”多次強調過,我們平常一般狹義上的 SEH 都是指 try-except 和 try-finally 異常機制,而它們是給 C 語言( VC 環境)編寫 windows driver 而設計的,所以 SEH 主要應該在 C 程式中被使用,而 C++ 程式則應該使用 try-catch 機制的 C++ 異常處理模型( micorsoft 的 MSDN 一直強烈建議程式員遵循此規則)。但是, SEH 到底能在 C++ 程式中使用嗎?“當然可以,肯定可以”,其實在一開始闡述 Windows 平台多種異常機制之間的關係時,就已經清楚地表明了這一點。
這篇文章系統地來看看 SEH 在 C++ 程式中的各種使用方式。
先來一個簡單的例子
其實簡單的例子,就是把以前的使用 SEH 機制的 C 程式,改稱 C++ 程式,看它能正常編譯和運行否?什麼意思,很簡單,就是把原來的 .c 程式的副檔名改為 .cpp 檔案,也即此時 VC 編譯器會採用 C++ 語言來編譯此程式(這也即為 C++ 程式了)。朋友們試試吧!代碼如下:
// 注意,這是 C++ 程式,檔案名稱為: SEH-test.cpp
#include "stdio.h"
void test()
{
int* p = 0x00000000; // pointer to NULL
__try
{
puts("in try");
__try
{
puts("in try");
// causes an access violation exception;
// 導致一個儲存異常
*p = 13;
puts(" 這裡不會被執行到 ");
}
__finally
{
puts("in finally");
}
puts(" 這裡也不會被執行到 ");
}
__except(puts("in filter 1"), 0)
{
puts("in except 1");
}
}
void main()
{
puts("hello");
__try
{
test();
}
__except(puts("in filter 2"), 1)
{
puts("in except 2");
}
puts("world");
}
是不是能編譯通過,而且運行結果也和以前 c 程式的運行結果完全一致,如下:
hello
in try
in try
in filter 1
in filter 2
in finally
in except 2
world
Press any key to continue
來一個真正意義上的 C++ 程式,且使用 SEH 機制
也許很多程式員朋友對上面的例子不以為然,覺得它說明不了什麼問題。好的,現在我們來看一個 真正意義上的 C++ 程式,且使用 SEH 機制。什麼是真正意義上的 C++ 程式,當然是採用了物件導向技術。看例子吧!代碼如下(其實就是在上面程式的基礎上加了一個 class ):
// 注意,這是 C++ 程式,檔案名稱為: SEH-test.cpp
#include "stdio.h"
class A
{
public:
void f1() {}
void f2() {}
};
void test1()
{
A a1;
A a2,a3;
a2.f1();
a3.f2();
}
void test()
{
int* p = 0x00000000; // pointer to NULL
__try
{
// 這裡調用 test1 函數,它函數內部會創造 object
// 應該屬於 100% 的 C++ 程式了吧!
test1();
puts("in try");
__try
{
puts("in try");
// causes an access violation exception;
// 導致一個儲存異常
*p = 13;
puts(" 這裡不會被執行到 ");
}
__finally
{
puts("in finally");
}
puts(" 這裡也不會被執行到 ");
}
__except(puts("in filter 1"), 0)
{
puts("in except 1");
}
}
void main()
{
puts("hello");
__try
{
test();
}
__except(puts("in filter 2"), 1)
{
puts("in except 2");
}
puts("world");
}
總結
通過以上實踐得知, SEH 的確可以在 C++ 程式中使用,而且 SEH 不僅可以在 C++ 程式中使用;更進一步, SEH 異常機制( try-except 和 try-finally )還可以與 C++ 異常處理模型( try-catch ),兩者在同一個 C++ 程式中混合使用,這在下一篇文章中接著討論。
但問題是,微軟 MSDN 的忠告( C 程式中使用 try-except 和 try-finally ;而 C++ 程式則應該使用 try-catch ),這豈不是完全屬於嚇唬人嗎?非也!非也!微軟的建議一點也沒有錯, SEH 與 C++ 異常處理機制混合使用時,的確有一定的約束(雖然,平時我們很少關心這一點),這同樣也在下一篇文章中詳細接著討論, 程式員朋友們,繼續吧!