青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

yehao's Blog

C++及Windows異常處理(try,catch; __try,__finally; __try, __except)

題目:

 int* p = 0x00000000; // pointer to NULL
 puts( "hello ");
 __try{
 puts( "in try ");
 __try{
 puts( "in try ");
 *p = 13; // causes an access violation exception;
 }__finally{
 puts( "in finally ");
 }
 }__except(puts( "in filter "), 1){
 puts( "in except ");
 }
 puts( "world ");
 /*
 hello
 in try
 in try
 in filter
 in finally
 in except
 world
 */

上面的題目,我把答案列了出來。

常用C++的朋友,應該沒見過__try這種形式的語句,下面我把try,catch; __try,__finally; __try, __except這三對異常處理使用標示逐一說明

 

本文參考了如下博文:

http://www.cnblogs.com/wenziqi/archive/2010/08/26/1809074.html

http://blog.csdn.net/lvwenshuai/article/details/6163342

http://topic.csdn.net/t/20030527/10/1838724.html

http://zhidao.baidu.com/question/183400727.html

 

  • C++ 異常處理:try,catch
try { // 可能出錯的語句 // 如果有錯,就—— throw ... // 初始化一個異常對象(exception object) } catch( 類型名 [形參名] ) /* 異常說明符(exception specifier)*/ { } catch( 類型名 [形參名] ) { }

C++的異常處理很簡單,就是如上的三個關鍵字,注意C++中throw,catch之后沒有Java等語言中的finally。

Q: 為何C++不提供“finally”結構? 
A: 因為C++提供了另一種機制,完全可以取代finally,而且這種機制幾乎總要比finally工作得更好:就是——“分配資源即初始化”。(見《The C++ Programming Language》14.4節)基本的想法是,用一個局部對象來封裝一個資源,這樣一來局部對象的析構函數就可以自動釋放資源。這樣,程序員就不會“忘記釋放資源”了。 [譯注:因為C++的對象“生命周期”機制替他記住了 :O) ] 下面是一個例子:

class File_handle {
 FILE* p;
 public:
 File_handle(const char* n, const char* a)
 { p = fopen(n,a); if (p==0) throw Open_error(errno); }
 File_handle(FILE* pp)
 { p = pp; if (p==0) throw Open_error(errno); }
 
 ~File_handle() { fclose(p); }
 
 operator FILE*() { return p; }
 
 // ...
 };
 
 void f(const char* fn)
 {
 File_handle f(fn,"rw"); // open fn for reading and writing
 // use file through f
 }

在一個系統中,每一樣資源都需要一個“資源局柄”對象,但我們不必為每一個資源都寫一個“finally”語句。在實作的系統中,資源的獲取和釋放的次數遠遠多于資源的種類,所以“資源分配即初始化”機制產生的代碼要比“finally”機制少。

 

好了,接下來,看另外兩組異常模型機制,它們是Windows系列操作系統平臺上提供的SEH模型,也就是說在C++中調用的時候,其實是調用Windows的API

SEH,又稱結構化異常處理.是設計Windows操作系統時提出一個種處理異常的方法。

  • __try, __except

這組異常處理機制和C++的很相像,只是關鍵字是except而不是catch

catch 和 except 的一點不同: catch關鍵字后面往往好像接受一個函數參數一樣,可以是各種類型的異常數據對象;但是__except關鍵字則不同,它后面跟的卻是一個表達式(可以是各種類型的表達式)

下面是一個例子:

void main()
{
 puts("hello");
 // 定義受監控的代碼模塊
 __try
 {
 puts("in try");
 }
 //定義異常處理模塊
 __except(1)
 {
 puts("in except");
 }
 puts("world");
}

1. 受監控的代碼模塊被執行(也即__try定義的模塊代碼); 
2. 如果上面的代碼執行過程中,沒有出現異常的話,那么控制流將轉入到__except子句之后的代碼模塊中; 
3. 否則,如果出現異常的話,那么控制流將進入到__except后面的表達式中,也即首先計算這個表達式的值,之后再根據這個值,來決定做出相應的處理。

EXCEPTION_CONTINUE_EXECUTION (–1) 異常被忽略,控制流將在異常出現的點之后,繼續恢復運行。 
EXCEPTION_CONTINUE_SEARCH (0) 異常不被識別,也即當前的這個__except模塊不是這個異常錯誤所對應的正確的異常處理模塊。系統將繼續到上一層的try-except域中繼續查找一個恰當的__except模塊。 
EXCEPTION_EXECUTE_HANDLER (1) 異常已經被識別,也即當前的這個異常錯誤,系統已經找到了并能夠確認,這個__except模塊就是正確的異常處理模塊??刂屏鲗⑦M入到__except模塊中。

小結:

(1) C++異常模型用try-catch語法定義,而SEH異常模型則用try-except語法;

(2) 與C++異常模型相似,try-except也支持多層的try-except嵌套。

(3) 與C++異常模型不同的是,try-except模型中,一個try塊只能是有一個except塊;而C++異常模型中,一個try塊可以有多個catch塊。

(4) 與C++異常模型相似,try-except模型中,查找搜索異常模塊的規則也是逐級向上進行的。但是稍有區別的是,C++異常模型是按照異常對象的類型來進行匹配查找的;而try-except模型則不同,它通過一個表達式的值來進行判斷。如果表達式的值為1(EXCEPTION_EXECUTE_HANDLER),表示找到了異常處理模塊;如果值為0(EXCEPTION_CONTINUE_SEARCH),表示繼續向上一層的try-except域中繼續查找其它可能匹配的異常處理模塊;如果值為-1(EXCEPTION_CONTINUE_EXECUTION),表示忽略這個異常,注意這個值一般很少用,因為它很容易導致程序難以預測的結果,例如,死循環,甚至導致程序的崩潰等。

(5) __except關鍵字后面跟的表達式,它可以是各種類型的表達式,例如,它可以是一個函數調用,或是一個條件表達式,或是一個逗號表達式,或干脆就是一個整型常量等等。最常用的是一個函數表達式,并且通過利用GetExceptionCode()或GetExceptionInformation ()函數來獲取當前的異常錯誤信息,便于程序員有效控制異常錯誤的分類處理。

(6) SEH異常處理模型中,異常被劃分為兩大類:系統異常和軟件異常。其中軟件異常通過RaiseException()函數拋出。RaiseException()函數的作用類似于C++異常模型中的throw語句。

詳細的請參看:http://www.cnblogs.com/wenziqi/archive/2010/08/26/1809074.html

 

  • __try, __finally

try-finally語句的語法與try-except很類似,稍有不同的是,__finally后面沒有一個表達式,這是因為try- finally語句的作用不是用于異常處理,所以它不需要一個表達式來判斷當前異常錯誤的種類。另外,與try-except語句類似,try- finally也可以是多層嵌套的,并且一個函數內可以有多個try-finally語句,不管它是嵌套的,或是平行的。當然,try-finally多層嵌套也可以是跨函數的。

最關鍵的一點: “不管在何種情況下,在離開當前的作用域時,finally塊區域內的代碼都將會被執行到”

void tmain()
{
 puts("hello");
 __try
 {
 puts("__try塊中");
 
 // 注意,下面return語句直接讓函數返回了
 return;
 }
 __finally
 {
 puts("__finally塊中");
 }
 
 puts("world");

上面的程序運行結果如下: 
hello 
__try塊中 
__finally塊中 
Press any key to continue

 

小結:

__finally塊被執行的流程時,無外乎三種情況。

第一種就是順序執行到__finally塊區域內的代碼,這種情況很簡單,容易理解;

第二種就是goto語句或return語句引發的程序控制流離開當前__try塊作用域時,系統自動完成對__finally塊代碼的調用;

第三種就是由于在__try塊中出現異常時,導致程序控制流離開當前__try塊作用域,這種情況下也是由系統自動完成對__finally塊的調用。

無論是第 2種,還是第3種情況,毫無疑問,它們都會引起很大的系統開銷,編譯器在編譯此類程序代碼時,它會為這兩種情況準備很多的額外代碼。

一般第2種情況,被稱為“局部展開(LocalUnwinding)”;第3種情況,被稱為“全局展開(GlobalUnwinding)”。在后面闡述SEH實現的時候會詳細分析到這一點。

第3種情況,也即由于出現異常而導致的“全局展開”,對于程序員而言,這也許是無法避免的,因為你在利用異常處理機制提高程序可靠健壯性的同時,不可避免的會引起性能上其它的一些開銷。呵呵!這世界其實也算瞞公平的,有得必有失。


到此,本文開頭的那段代碼的結果就沒有任何懸念了,O(∩_∩)O哈哈~,每天進步一點點~~~~~~~~

轉自:http://shijuanfeng.blogbus.com/logs/178616871.html

posted on 2012-02-07 14:32 厚積薄發 閱讀(12620) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

導航

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

統計

常用鏈接

留言簿

隨筆分類

文章分類

文章檔案

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久国产精品人| 99国产一区二区三精品乱码| 一区二区在线视频播放| 国产亚洲一区二区三区在线播放| 国产乱码精品1区2区3区| 国产精品一区二区在线| 国产一区二区成人| 在线播放中文一区| 亚洲九九九在线观看| 一区二区三区欧美日韩| 性欧美在线看片a免费观看| 久久九九久久九九| 亚洲福利专区| 最新日韩av| 亚洲欧美日韩国产另类专区| 久久久久天天天天| 欧美日韩大片一区二区三区| 国产精品无码永久免费888| 黄网动漫久久久| 亚洲精品婷婷| 亚洲视频电影在线| 亚洲乱码国产乱码精品精天堂| 在线视频你懂得一区二区三区| 午夜精品久久久久久久99水蜜桃 | 国产精品一级| 最新亚洲电影| 欧美在线免费观看| 亚洲国产精品第一区二区| 午夜精品999| 欧美日韩成人在线视频| 永久免费视频成人| 亚洲欧美国产制服动漫| 欧美1区3d| 欧美亚洲视频在线观看| 久久综合五月天婷婷伊人| 一区二区电影免费在线观看| 久久久无码精品亚洲日韩按摩| 欧美午夜精品久久久久久人妖| 永久久久久久| 老司机午夜精品视频| 亚洲一区二区少妇| 欧美日韩性生活视频| 在线观看精品一区| 久久久久.com| 亚洲欧美一区二区三区久久| 欧美激情中文字幕一区二区| 亚洲第一黄色| 久久久噜噜噜久噜久久| 亚洲自拍偷拍色片视频| 欧美日韩一区在线播放| 99re热精品| 亚洲激情亚洲| 欧美福利一区二区| 亚洲激情视频网站| 欧美国产日产韩国视频| 久久久久免费| 亚洲福利在线看| 欧美va亚洲va香蕉在线| 久久精品国产v日韩v亚洲 | 国产九九精品视频| 午夜精品久久久久久99热软件| 日韩小视频在线观看专区| 欧美日韩亚洲一区三区| 亚洲午夜小视频| 亚洲四色影视在线观看| 国产精品视区| 久久久福利视频| 久久久.com| 亚洲国产电影| 亚洲激情网站| 国产精品亚洲片夜色在线| 欧美在线精品免播放器视频| 亚洲欧美在线看| 黄色成人在线网站| 亚洲国产成人在线播放| 亚洲精品一区在线观看| 亚洲人屁股眼子交8| 欧美成人伊人久久综合网| 亚洲精品在线观| 夜夜嗨av一区二区三区网页| 国产精品美女主播| 久久精品日产第一区二区三区| 欧美一区二区在线免费观看| 在线不卡中文字幕| 亚洲精品免费在线| 国产精品福利片| 久久久国产一区二区三区| 麻豆成人综合网| 亚洲一区二区三区视频播放| 午夜亚洲性色视频| 久久成人免费网| 亚洲欧洲精品一区二区| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 免费不卡在线视频| 亚洲综合999| 久久久久久久综合色一本| 亚洲精品欧美一区二区三区| 亚洲一区二区在线看| 亚洲黄色在线视频| 午夜精品免费视频| 亚洲欧洲另类国产综合| 亚洲欧美日韩人成在线播放| 亚洲欧洲一区二区三区在线观看 | 久久精品72免费观看| 模特精品裸拍一区| 欧美与黑人午夜性猛交久久久| 乱码第一页成人| 欧美制服丝袜| 欧美人成在线| 久久最新视频| 国产乱码精品一区二区三区av| 欧美国产综合一区二区| 国产伦精品一区二区三区免费| 欧美激情一区在线| 国产无一区二区| 在线亚洲免费视频| 亚洲美女精品成人在线视频| 久久成人国产| 久久精品国产91精品亚洲| 欧美精品在线一区二区三区| 玖玖视频精品| 国产欧美日韩一区二区三区在线| 亚洲精选成人| 日韩午夜av在线| 久久三级福利| 免费成人av资源网| 国产精品一区二区视频| 亚洲欧洲一区二区三区久久| 精品成人久久| 国内久久婷婷综合| 亚洲国产精品久久久久秋霞不卡 | 久久精品国产亚洲aⅴ| 午夜激情久久久| 欧美日韩福利在线观看| 亚洲国产精品毛片| 亚洲人成亚洲人成在线观看图片| 久久人人爽人人爽爽久久| 久久婷婷一区| 影音先锋国产精品| 乱中年女人伦av一区二区| 欧美成人亚洲成人| 最新精品在线| 欧美日韩精品在线观看| 99riav久久精品riav| 亚洲欧美国产精品专区久久| 欧美视频在线观看一区二区| 一本久道综合久久精品| 亚洲一区二区三区视频播放| 欧美午夜免费| 亚洲欧美日韩中文视频| 亚洲欧美日韩成人高清在线一区| 欧美三区免费完整视频在线观看| 日韩视频中午一区| 午夜精品一区二区三区在线播放 | 亚洲精品美女在线观看| 制服丝袜亚洲播放| 国产精品午夜在线观看| 欧美在线地址| 亚洲第一级黄色片| 亚洲视频中文字幕| 国产精品一区二区视频| 久久本道综合色狠狠五月| 麻豆成人综合网| 日韩一级片网址| 国产精品美女在线观看| 狂野欧美一区| 亚洲少妇中出一区| 久久丁香综合五月国产三级网站| 伊人久久噜噜噜躁狠狠躁| 欧美日本国产视频| 欧美一二区视频| 亚洲成在人线av| 欧美一级二区| 亚洲国产一区二区视频| 国产精品成人国产乱一区| 久久九九国产| 亚洲视屏一区| 亚洲国产精品一区二区第四页av| 亚洲欧美久久久| 亚洲人成网站777色婷婷| 国产精品久久婷婷六月丁香| 久久综合色播五月| 亚洲欧美日本视频在线观看| 亚洲国产精品一区制服丝袜| 性欧美暴力猛交另类hd| 亚洲免费观看在线观看| 狠狠色丁香婷婷综合久久片| 欧美视频三区在线播放| 蜜桃精品久久久久久久免费影院| 亚洲免费人成在线视频观看| 最新日韩av| 亚洲电影自拍| 久久综合九色综合欧美就去吻| 亚洲女与黑人做爰| 乱中年女人伦av一区二区| 欧美大片91| 久久精品国产一区二区三区免费看 | 欧美电影在线观看| 久久国产视频网| 亚洲男人av电影|