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

兔子的技術博客

兔子

   :: 首頁 :: 聯系 :: 聚合  :: 管理
  202 Posts :: 0 Stories :: 43 Comments :: 0 Trackbacks

留言簿(10)

最新評論

閱讀排行榜

評論排行榜

最近做了一個Windows下的異常處理模塊,查閱了一些新的資料,結合我自己的理解,將一些點滴記錄如下,希望對兄弟們有所幫助。

一、C++標準異常

也就是try、throw、catch這三個關鍵字。

try
{
    ……
    throw <exception-data>
    ……
}

catch (<exception-declaration 1>)
{
    ……
}
catch (<exception-declaration 2>)
{
    ……
}
……

try塊中的throw會拋出一個數據<exception-data>,比如一個整數,一個字串,或是其他自定義類型的數據。這時,當前程序中止執行,開始查找catch入口。throw拋出的數據類型與catch入口的<exception-declaration>數據類型必須匹配,這一點類似函數調用的形參、實參匹配。一個try塊可以對應多個catch塊,這一點類似于函數的重載。當然,你也可以用catch (…)來接收所有可能拋出的數據。MFC提供了一些標準的拋出異常類型,如CFileException類、CDaoException類等,它們都是CException類的派生類,使用MFC時可以了解一下,這里就不多說。

執行完catch塊,程序會繼續向下執行。

當throw在本函數(或說棧的本幀)沒有找到合適的catch塊時,會向上一層調用函數(或說棧的上一幀)回溯,直到匹配到合適的try-catch塊為止。也就是說,try-catch塊可以捕獲到try塊中調用(可以是多層調用)的函數中的,沒被處理的異常。同時,try-catch塊是可以嵌套的。

那么,有一個問題:沒有try-catch塊的,或查找到調用頂層(如main函數)都沒有匹配上catch塊的throw語句會如何執行呢?這在不同操作系統會有不同的處理,在Windows中則是由一個叫SEH的機制來處理的。

二、Windows SEH

SEH(Structured Exception Handling),即結構化異常處理,是Microsoft提供的異常處理機制。要了解這個機制,咱先來了解一下__try-__except關鍵字。

1. __try-__except關鍵字

__try
{
    ……
}

__except (<exception>)
{
    ……
}

__try-__except是Microsoft擴展出的C++關鍵字,__try塊中出現錯誤或異常,一般不再用throw拋出,而是直接產生一個EXCEPTION_POINTERS類型的異常數據,然后開始查找SEH例程入口(調試的情況除外)。首先就會找到與__try塊對應的__except塊。__except的參數<exception>與catch的參數作用完全不同,也不類似于函數的參數,它主要是用于控制后面的程序執行,為這幾個值之一:

EXCEPTION_EXECUTE_HANDLER(1),表示下面執行__except塊內及其后面的代碼
EXCEPTION_CONTINUE_EXECUTION(-1),表示回到拋出異常處繼續向下執行
EXCEPTION_CONTINUE_SEARCH(0), 表示查找下一個異常處理例程入口

Microsoft提供兩個函數GetExceptionCode(), GetExceptionInformation(),分別可以獲取異常號和EXCEPTION_POINTERS類型的異常數據指針。而且這兩個函數只能在__except參數<exception>的表達式中使用。為了保證這一點,在Microsoft Visual C++(以下簡稱VC)中,編譯器做了特殊處理,如果這兩個函數沒有在正確的位置,將產生編譯錯誤。(這個感覺有點搞。)

所以,__except一行一般會這樣寫:__except (ExceptFilterFunc(GetExceptionInformation())),其中ExceptFilterFunc是一個自定義的異常處理例程,它輸入一個EXCEPTION_POINTERS *類型的參數,返回EXCEPTION_EXECUTE_HANDLER、EXCEPTION_CONTINUE_EXECUTION或EXCEPTION_CONTINUE_SEARCH。

(注:下面所提到的“異常處理例程”,不管是自定義的還是系統提供的,都是這種類型的函數,這種函數指針類型在winbase.h中被定義為LPTOP_LEVEL_EXCEPTION_FILTER。)

EXCEPTION_POINTERS結構中包含豐富的異常相關數據,主要有異常號、異常發生時寄存器的值等。

與try-catch一樣,__try-__except也支持調用?;厮?,也可以嵌套,但沒法重載。

另外,在VC中,還提供__try-__finally塊和__leave關鍵字,這里不細說了,感興趣的可以查查MSDN。

2. Windows異常處理步驟

回到上文的問題,沒有匹配上catch、__except塊的錯誤或異常將會如何處理呢?原來,包括__except塊在內,SEH異常處理例程可以有多個,它們的入口地址形成一個鏈式結構,這個鏈式結構由Windows操作系統管理。

發生錯誤或異常后,Windows的處理順序一般如下:

(1)中止當前程序的執行。

(2)如果程序處于被調試狀態,向調試器發送EXCEPTION_DEBUG_EVENT消息。

(3)如果程序沒有被調試或者調試器未能處理異常,查找線程相關的異常處理例程(如對應__except塊)并處理。如果前面查找到的例程返回EXCEPTION_CONTINUE_SEARCH,且線程有多個異常處理例程,則沿這些例程入口地址組成的鏈式結構逐一向后查找,請求下一個例程處理。

(4)如果線程沒有對應的異常處理例程,或線程所有例程都返回EXCEPTION_CONTINUE_SEARCH,而且程序處于被調試狀態,再次通知調試器。

(5)如果程序沒有被調試或者調試器仍未處理異常,則進入主線程的“最終異常處理例程”鏈繼續查找。

(6)“最終異常處理例程”鏈的最后是Windows默認的系統異常處理程序__CxxUnhandledExceptionFilter(),其處理通常是彈出一個異常對話框,上面顯示一些異常信息,提供“關閉”、“調試”等按鈕。

著名的SetUnhandledExceptionFilter()函數就是在所謂“最終異常處理例程”鏈的__CxxUnhandledExceptionFilter()之前插入一個自定義的異常處理例程,當這個例程返回EXCEPTION_EXECUTE_HANDLER時,一般會直接結束進程。

三、兩種異常處理機制的比較

我能想到的一些特征的比較:

C++標準異常

SEH

局部對象析構函數

執行

局部對象有析構函數,且用__try-__exception時,編譯錯誤

可重載

有參數類型匹配

無條件處理

可移植

C++都有,不依賴操作系統平臺

只有Windows提供

程序流程控制

catch塊后只能繼續向下執行

EXCEPTION_EXECUTE_HANDLER、EXCEPTION_CONTINUE_EXECUTION、

EXCEPTION_CONTINUE_SEARCH三種流程控制,多個處理例程的依次處理

數據通用

各種不同的異常數據類型

統一結構的異常數據

 

四、VC編譯參數EH

在VC中,你可能會發現一個怪異的現象,就是try-catch塊無法捕獲像“除0”、“空指針訪問”之類的異常。原來,在VC中一般的錯誤和異常都是用SEH來處理的,不等同于throw拋出的異常。而try-catch對結構化異常的處理,是由編譯參數EH來控制的。

EH參數

EHs(EHsc)

EHa(Ehac)

try-catch

不處理異常

只處理C++標準異常,代碼優化較好

處理C++標準異常和結構化異常,代碼優化較差

__try-__exceptVC2005及以后)

處理C++標準異常和結構化異常

處理C++標準異常和結構化異常

處理C++標準異常和結構化異常

__try-__exceptVC2003及以前)

只處理結構化異常

只處理結構化異常

只處理結構化異常

 

從表中可以看出,EH參數對__try-__except塊的處理并無影響。

從VC2005開始,SEH也可以統一捕獲和處理C++標準異常。而在VC2003及之前,C++標準異常只能由catch塊來捕獲。

VC2005中,EH參數默認為EHsc。

附記:關于自定義SEH異常處例程的編寫,如保存內存dump,保存調用棧,使用調試相關的.pdb .map文件等,網上相關的資料很多,需要可以查詢。



轉自:http://hi.baidu.com/xplot/blog/item/9e7f3154b6e635c2b645ae32.html
posted on 2010-11-04 12:54 會飛的兔子 閱讀(1327) 評論(0)  編輯 收藏 引用 所屬分類: C++及開發環境
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久伊人欧美| 亚洲高清资源| 狠狠v欧美v日韩v亚洲ⅴ| 欧美午夜宅男影院在线观看| 欧美激情亚洲激情| 欧美精品免费视频| 国产精品v亚洲精品v日韩精品| 欧美网站大全在线观看| 国产精品theporn88| 国产伦精品一区二区三区高清| 国产精品视频第一区| 国产女人水真多18毛片18精品视频| 国产精品一二三| 狠狠色噜噜狠狠色综合久| 亚洲国产精品成人久久综合一区| 日韩西西人体444www| 亚洲欧美久久| 久久综合久久久久88| 欧美成年人网站| 日韩亚洲成人av在线| 亚洲欧美卡通另类91av| 久久这里只有| 国产精品99免视看9| 黑人巨大精品欧美一区二区小视频| 亚洲第一在线| 亚洲欧洲99久久| 国产一区二区三区四区| 亚洲激精日韩激精欧美精品| 亚洲作爱视频| 久久蜜桃香蕉精品一区二区三区| 欧美电影免费观看高清完整版| 日韩一级免费| 久久国产色av| 国产精品久久久久77777| 激情综合色综合久久| 亚洲天堂激情| 免费看成人av| 亚洲一区二区三区影院| 久久久精品国产一区二区三区| 欧美激情综合五月色丁香| 国产婷婷97碰碰久久人人蜜臀| 亚洲精品自在在线观看| 久久精品视频一| 亚洲视频一区在线观看| 久久频这里精品99香蕉| 国产精品普通话对白| 亚洲精品欧美在线| 免费观看久久久4p| 欧美中文在线免费| 国产麻豆午夜三级精品| 一区二区国产日产| 欧美国产日产韩国视频| 久久精品国产一区二区电影| 国产精品久久一卡二卡| 一本久久综合| 亚洲国产精彩中文乱码av在线播放| 亚洲欧美中文日韩在线| 国产精品地址| 亚洲一区二区三区精品动漫| 亚洲区在线播放| 蜜桃久久精品一区二区| 伊人精品成人久久综合软件| 久久国产视频网站| 亚洲欧美日韩精品在线| 国产精品一区二区久激情瑜伽| 亚洲视频你懂的| 99热这里只有精品8| 欧美日韩精品在线视频| 夜夜嗨av一区二区三区中文字幕 | 亚洲精品之草原avav久久| 久久影院午夜片一区| 欧美在线二区| 国内精品美女在线观看| 久久亚洲高清| 久久一区二区三区av| 亚洲国产精品成人一区二区| 亚洲国产精品欧美一二99| 欧美精品日日鲁夜夜添| 一本一本久久a久久精品牛牛影视| 亚洲人成小说网站色在线| 欧美日韩精品免费观看视频完整| aa日韩免费精品视频一| 午夜精品国产| 亚洲一区制服诱惑| 国产日产亚洲精品| 久久综合久久综合九色| 免费在线看一区| 亚洲免费精彩视频| av成人黄色| 国产日韩视频一区二区三区| 久久天天综合| 欧美aa国产视频| 亚洲欧美日韩综合国产aⅴ| 午夜精品福利一区二区三区av | 榴莲视频成人在线观看| 亚洲国产三级在线| 亚洲精品视频一区| 国产精品影片在线观看| 美女主播视频一区| 欧美日韩亚洲在线| 久久亚洲精品一区二区| 欧美精品尤物在线| 久久av一区二区三区漫画| 久久蜜桃资源一区二区老牛 | 西瓜成人精品人成网站| 亚洲成人在线网站| 制服丝袜激情欧洲亚洲| 精品av久久久久电影| 最近中文字幕日韩精品 | 免费亚洲一区| 性久久久久久久| 久久综合久久综合久久综合| 亚洲最黄网站| 久久久一区二区三区| 亚洲天堂成人| 欧美99久久| 久久男人av资源网站| 欧美色欧美亚洲另类二区| 久久婷婷麻豆| 国产精品欧美一区二区三区奶水| 欧美激情在线免费观看| 国产欧美亚洲一区| 亚洲免费播放| 亚洲激情国产| 久久国产精品久久久久久| 亚洲视频在线观看三级| 久久综合导航| 久久久国产午夜精品| 国产精品久久久对白| 99re66热这里只有精品3直播| 极品尤物一区二区三区| 欧美资源在线| 久久久国产精彩视频美女艺术照福利 | 久久人体大胆视频| 欧美视频日韩视频| 亚洲国产精品国自产拍av秋霞| 国外视频精品毛片| 欧美一区2区三区4区公司二百| 亚洲综合成人在线| 欧美日韩三级一区二区| 91久久久久久久久久久久久| 亚洲第一视频网站| 狂野欧美激情性xxxx| 开元免费观看欧美电视剧网站| 国产一区二区剧情av在线| 亚洲欧美变态国产另类| 性娇小13――14欧美| 国产日韩综合一区二区性色av| 亚洲欧美精品在线观看| 久久精品中文字幕一区| 国产综合婷婷| 久久人人爽人人爽爽久久| 免费亚洲电影| 亚洲欧洲美洲综合色网| 狼人社综合社区| 欧美成人69av| 99精品国产热久久91蜜凸| 欧美日韩国产成人在线91| 9人人澡人人爽人人精品| 亚洲制服av| 国产伦理精品不卡| 久久精品国产亚洲一区二区| 欧美电影免费观看网站| 日韩图片一区| 亚洲女同精品视频| 国产拍揄自揄精品视频麻豆| 久久久999国产| 亚洲黄色尤物视频| 午夜影院日韩| 一色屋精品亚洲香蕉网站| 欧美韩日亚洲| 亚洲综合成人婷婷小说| 久久视频一区二区| 日韩一级大片| 国产热re99久久6国产精品| 狂野欧美性猛交xxxx巴西| 亚洲色诱最新| 欧美成人精品一区二区| 亚洲影视在线| 亚洲国产小视频在线观看| 欧美午夜激情在线| 久久久久久久久久久久久女国产乱 | 亚洲欧美日韩成人| 欧美wwwwww| 亚洲欧美在线磁力| 91久久精品一区二区三区| 国产精品一区毛片| 欧美激情一区二区三区| 欧美夜福利tv在线| 日韩亚洲精品电影| 欧美激情2020午夜免费观看| 香蕉久久a毛片| 99这里只有久久精品视频| 狠狠色丁香婷婷综合影院 | 亚洲国产一区二区a毛片| 国产亚洲激情视频在线| 欧美日韩国产一区二区| 巨乳诱惑日韩免费av| 亚洲欧美区自拍先锋| 亚洲视频久久|