您好,登錄后才能下訂單哦!
這篇文章主要介紹“C++編譯器怎么實現(xiàn)異常處理”,在日常操作中,相信很多人在C++編譯器怎么實現(xiàn)異常處理問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++編譯器怎么實現(xiàn)異常處理”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
C++編譯器是一個與標(biāo)準化C++高度兼容的編譯環(huán)境,其強大的CUP優(yōu)化功能可以使程序變得非常干凈并且容易維護,好了下面就請大家跟隨本文一起進入C++編譯器的世界吧。
本文討論了C++編譯器如何實現(xiàn)異常處理。我將假定你已經(jīng)熟悉異常處理的語法和機制。本文還提供了一個用于VC++的異常處理庫,要用庫中的處理程序替換掉VC++提供的那個,你只需要調(diào)用下面這個函數(shù):
struct EXCEPTION_REGISTRATION { EXCEPTION_REGISTRATION* prev; DWORD handler; };
之后,程序中的所有異常,從它們被拋出到堆棧展開(stack unwinding),再到調(diào)用catch塊,***到程序恢復(fù)正常運行,都將由我的異常處理庫來管理與其它C++特性一樣,C++標(biāo)準并沒有規(guī)定編譯器應(yīng)該如何來實現(xiàn)異常處理。
這意味著每一個C++編譯器的提供商都可以用它們認為恰當(dāng)?shù)姆绞絹韺崿F(xiàn)它。下面我會描述一下VC++是怎么做的,但即使你使用其它的C++編譯器或操作系統(tǒng)①,本文也應(yīng)該會是一篇很好的學(xué)習(xí)材料。
VC++的實現(xiàn)方式是以windows系統(tǒng)的結(jié)構(gòu)化異常處理(SEH)②為基礎(chǔ)的。 結(jié)構(gòu)化異常處理—概述在本文的討論中,我認為異常或者是被明確的拋出的,或者是由于除零溢出、空指針訪問等引起的。
當(dāng)它發(fā)生時會產(chǎn)生一個中斷,接下來控制權(quán)就會傳遞到操作系統(tǒng)的手中。操作系統(tǒng)將調(diào)用異常處理程序,檢查從異常發(fā)生位置開始的函數(shù)調(diào)用序列,進行堆棧展開和控制權(quán)轉(zhuǎn)移。Windows定義了結(jié)構(gòu)“EXCEPTION_REGISTRATION”,使我們能夠向操作系統(tǒng)注冊自己的異常處理程序。
#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; //不會運行到這 } int g_div = 0; void bar() { //初始化一個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; //注冊! _asm { mov EAX, preg mov FS:[0], EAX }
注意EXCEPTION_REGISTRATION必須定義在棧上,并且必須位于比上一個結(jié)點更低的內(nèi)存地址上,Windows對此有嚴格要求,達不到的話,它就會立刻終止進程。
到此,關(guān)于“C++編譯器怎么實現(xiàn)異常處理”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。