真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++編譯器怎么實(shí)現(xiàn)異常處理

這篇文章主要介紹“C++編譯器怎么實(shí)現(xiàn)異常處理”,在日常操作中,相信很多人在C++編譯器怎么實(shí)現(xiàn)異常處理問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”C++編譯器怎么實(shí)現(xiàn)異常處理”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

成都創(chuàng)新互聯(lián)-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比延吉網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式延吉網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋延吉地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴(lài)。

C++編譯器是一個(gè)與標(biāo)準(zhǔn)化C++高度兼容的編譯環(huán)境,其強(qiáng)大的CUP優(yōu)化功能可以使程序變得非常干凈并且容易維護(hù),好了下面就請(qǐng)大家跟隨本文一起進(jìn)入C++編譯器的世界吧。

本文討論了C++編譯器如何實(shí)現(xiàn)異常處理。我將假定你已經(jīng)熟悉異常處理的語(yǔ)法和機(jī)制。本文還提供了一個(gè)用于VC++的異常處理庫(kù),要用庫(kù)中的處理程序替換掉VC++提供的那個(gè),你只需要調(diào)用下面這個(gè)函數(shù):

struct EXCEPTION_REGISTRATION  {      EXCEPTION_REGISTRATION* prev;      DWORD handler;  };


之后,程序中的所有異常,從它們被拋出到堆棧展開(kāi)(stack unwinding),再到調(diào)用catch塊,***到程序恢復(fù)正常運(yùn)行,都將由我的異常處理庫(kù)來(lái)管理與其它C++特性一樣,C++標(biāo)準(zhǔn)并沒(méi)有規(guī)定編譯器應(yīng)該如何來(lái)實(shí)現(xiàn)異常處理。

這意味著每一個(gè)C++編譯器的提供商都可以用它們認(rèn)為恰當(dāng)?shù)姆绞絹?lái)實(shí)現(xiàn)它。下面我會(huì)描述一下VC++是怎么做的,但即使你使用其它的C++編譯器或操作系統(tǒng)①,本文也應(yīng)該會(huì)是一篇很好的學(xué)習(xí)材料。

VC++的實(shí)現(xiàn)方式是以windows系統(tǒng)的結(jié)構(gòu)化異常處理(SEH)②為基礎(chǔ)的。 結(jié)構(gòu)化異常處理—概述在本文的討論中,我認(rèn)為異?;蛘呤潜幻鞔_的拋出的,或者是由于除零溢出、空指針訪(fǎng)問(wèn)等引起的。

當(dāng)它發(fā)生時(shí)會(huì)產(chǎn)生一個(gè)中斷,接下來(lái)控制權(quán)就會(huì)傳遞到操作系統(tǒng)的手中。操作系統(tǒng)將調(diào)用異常處理程序,檢查從異常發(fā)生位置開(kāi)始的函數(shù)調(diào)用序列,進(jìn)行堆棧展開(kāi)和控制權(quán)轉(zhuǎn)移。Windows定義了結(jié)構(gòu)“EXCEPTION_REGISTRATION”,使我們能夠向操作系統(tǒng)注冊(cè)自己的異常處理程序。

#include    #include     using std::cout;   using std::endl;    struct EXCEPTION_REGISTRATION   {       EXCEPTION_REGISTRATION* prev;       DWORD handler;   };    EXCEPTION_DISPOSITION myHandler(       _EXCEPTION_RECORD *ExcRecord,       void * EstablisherFrame,       _CONTEXT *ContextRecord,       void * DispatcherContext)   {       cout << "In the exception handler" << endl;       cout << "Just a demo. exiting..." << endl;       exit(0);       return ExceptionContinueExecution; //不會(huì)運(yùn)行到這   }    int  g_div = 0;    void bar()   {       //初始化一個(gè)EXCEPTION_REGISTRATION結(jié)構(gòu)       EXCEPTION_REGISTRATION reg, *preg = ®        reg.handler = (DWORD)myHandler;        //取得當(dāng)前異常處理鏈的“頭”       DWORD prev;       _asm       {           mov EAX, FS:[0]           mov prev, EAX       }       reg.prev = (EXCEPTION_REGISTRATION*) prev;        //注冊(cè)!       _asm       {           mov EAX, preg           mov FS:[0], EAX       }

注意EXCEPTION_REGISTRATION必須定義在棧上,并且必須位于比上一個(gè)結(jié)點(diǎn)更低的內(nèi)存地址上,Windows對(duì)此有嚴(yán)格要求,達(dá)不到的話(huà),它就會(huì)立刻終止進(jìn)程。

到此,關(guān)于“C++編譯器怎么實(shí)現(xiàn)異常處理”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!


新聞名稱(chēng):C++編譯器怎么實(shí)現(xiàn)異常處理
鏈接地址:http://weahome.cn/article/jppdgi.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部