• <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>
            異常和中斷是程序運行時比較重要的2個概念, 異常通常是由程序內(nèi)部引起的(比較常見的如堆棧溢出, 空指針訪問等),中斷通常是由外部系統(tǒng)引起的, 外部產(chǎn)生的中斷在應(yīng)用程序中很多時候會以事件或回調(diào)的方式通知出來(比如常見的IO事件)。

            Windows上應(yīng)用程序的異常處理是以SEH(structure exception handler)的方式提供的, 關(guān)于SEH的實現(xiàn)原理,這里有篇不錯的文章可以參考《棧溢出中利用SEH》。

            關(guān)于SEH的使用,主要包括終止處理(finally)和異常處理(exception).

            (1)終止處理主要是由編譯器實現(xiàn)的,比如下面代碼
            __try
            {
            ...
            __leave
            ...
            }
            __finally
            {
            ...
            }
            無論是你在try塊中過早的return還是在try中發(fā)生了異常, 編譯器都會確保在任何情況下你的終止處理(finally)代碼都能得到執(zhí)行。

            (2)異常處理主要是由操作系統(tǒng)來實現(xiàn)的, 比如下面代碼
            __try
            {
            ...
            }
            __except(filter function)
            {
            ...
            }
            其中filter function可返回以下類型:
            EXCEPTION_EXECUTE_HANDLER: 這是告訴系統(tǒng), 我認(rèn)識這個異常,請執(zhí)行我的異常處理代碼,然后從接下來的第一行代碼開始繼續(xù)執(zhí)行 
            EXCEPTION_CONTINUE_SEARCH: 這個是告訴系統(tǒng), 我不認(rèn)識這個異常, 請繼續(xù)往外拋異常
            EXCEPTION_CONTINUE_EXECUTE: 這個是告訴系統(tǒng), 我已經(jīng)在調(diào)用filter時修正了這個異常, 請從發(fā)生異常的地方繼續(xù)執(zhí)行

            如何知道當(dāng)前程序發(fā)生了哪種類型的異常? 系統(tǒng)提供了2個接口:GetExceptionCode  GetExceptionInformation 
            比如我們常見的exception code包括:EXCEPTION_ACCESS_VIOLATION, EXCEPTION_STACK_OVERFLOW,EXCEPTION_INT_DIVIDE_BY_ZERO

            上面的幾種異常都是硬件異常,是由CPU在運行過程中引發(fā)的, 還有一些異常是軟件異常,是我們通過調(diào)用系統(tǒng)API RaiseException引發(fā)的。
            我們知道C++的異常處理大概是這樣的:
            try
            {
            ...
            }
            catch(int a)
            {
            ...
            }
            catch(...)
            {
            ...
            }
            思考C++異常和結(jié)構(gòu)化異常(SEH)是 什么關(guān)系? 
            實際C++異常是通過結(jié)構(gòu)化異常中的軟件異常實現(xiàn)的, 也就是通過調(diào)用RaiseException實現(xiàn)的, 通過測試我們可以發(fā)現(xiàn)VC編譯器C++異常的異常號永遠(yuǎn)是0xE06D7363,對應(yīng)ASCII碼“.msc".
            posted on 2014-09-19 21:00 Richard Wei 閱讀(4136) 評論(3)  編輯 收藏 引用

            FeedBack:
            # re: 關(guān)于SEH的簡單總結(jié)[未登錄]
            2014-09-22 12:58 | cc
            博主,你好,我本來是想改用C++的try catch (...) 捕獲所有異常
            try
            {
            int y = 0;
            int x = 5/y;
            cout << "y = " << y << endl;
            }
            catch (...)
            {
            cout << "Throw a Exception..." << endl;
            }
            但發(fā)現(xiàn),上面的代碼,根本就捕獲不到,也就是cout << "Throw a Exception..." << endl;
            這條語句,根本就不會輸出。

            運行環(huán)境VC2012 + Windows 7

            博主,你那邊有這種情況嗎?

            這是我的那篇文章的地址
            http://blog.csdn.net/cocoasprite/article/details/39289577  回復(fù)  更多評論
              
            # re: 關(guān)于SEH的簡單總結(jié)
            2014-09-22 13:18 | Richard Wei
            @cc
            本來就是, C++異常只能捕獲軟件異常, 硬件異常(如除零,空指針訪問)用操作系統(tǒng)的SEH捕獲。  回復(fù)  更多評論
              
            # re: 關(guān)于SEH的簡單總結(jié)[未登錄]
            2014-09-22 13:36 | cc
            嗯,受教了,謝謝!@Richard Wei
              回復(fù)  更多評論
              

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            日日狠狠久久偷偷色综合免费| 久久天天躁狠狠躁夜夜avapp| 色天使久久综合网天天| 国产精品内射久久久久欢欢| 99精品国产在热久久| 国产精品女同久久久久电影院| 一本久久a久久精品亚洲| 女人高潮久久久叫人喷水| 2021国内久久精品| 亚洲人成网站999久久久综合| 日韩精品无码久久一区二区三| 久久久久久一区国产精品| 久久国产影院| 一日本道伊人久久综合影| 欧美精品国产综合久久| 久久婷婷国产剧情内射白浆| 97久久国产综合精品女不卡| 久久精品www人人爽人人| 99久久免费国产特黄| 国产精品久久久99| 亚洲欧美日韩久久精品| 亚洲精品乱码久久久久久中文字幕 | 亚洲AV日韩精品久久久久| 亚洲综合精品香蕉久久网| 久久精品国产亚洲av麻豆色欲| 久久91精品国产91久久麻豆| 9191精品国产免费久久| 一级做a爰片久久毛片免费陪| 国产色综合久久无码有码| 韩国免费A级毛片久久| 国产成人久久精品麻豆一区| 人妻中文久久久久| 久久久久成人精品无码中文字幕| 亚洲乱亚洲乱淫久久| 四虎久久影院| WWW婷婷AV久久久影片| 久久久久人妻精品一区三寸蜜桃| 精品国产乱码久久久久软件| 美女写真久久影院| 亚洲人成伊人成综合网久久久 | 2021久久精品国产99国产精品|