SEH 可以在 C++ 程式中使用

來源:互聯網
上載者:User
文章目錄
  • 先來一個簡單的例子
  • 來一個真正意義上的 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++ 異常處理機制混合使用時,的確有一定的約束(雖然,平時我們很少關心這一點),這同樣也在下一篇文章中詳細接著討論, 程式員朋友們,繼續吧!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.