日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C++編譯器如何實(shí)現(xiàn)異常處理

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

成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作的關(guān)注點(diǎn)不是能為您做些什么網(wǎng)站,而是怎么做網(wǎng)站,有沒有做好網(wǎng)站,給成都創(chuàng)新互聯(lián)一個(gè)展示的機(jī)會(huì)來證明自己,這并不會(huì)花費(fèi)您太多時(shí)間,或許會(huì)給您帶來新的靈感和驚喜。面向用戶友好,注重用戶體驗(yàn),一切以用戶為中心。

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

 
 
 
  1. struct EXCEPTION_REGISTRATION  
  2. {  
  3.     EXCEPTION_REGISTRATION* prev;  
  4.     DWORD handler;  
  5. };   

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

這意味著每一個(gè)C++編譯器的提供商都可以用它們認(rèn)為恰當(dāng)?shù)姆绞絹韺?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)為異常或者是被明確的拋出的,或者是由于除零溢出、空指針訪問等引起的。

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

 
 
 
  1. #include    
  2. #include    
  3.  
  4. using std::cout;   
  5. using std::endl;   
  6.  
  7. struct EXCEPTION_REGISTRATION   
  8. {   
  9.     EXCEPTION_REGISTRATION* prev;   
  10.     DWORD handler;   
  11. };   
  12.  
  13. EXCEPTION_DISPOSITION myHandler(   
  14.     _EXCEPTION_RECORD *ExcRecord,   
  15.     void * EstablisherFrame,   
  16.     _CONTEXT *ContextRecord,   
  17.     void * DispatcherContext)   
  18. {   
  19.     cout << "In the exception handler" << endl;   
  20.     cout << "Just a demo. exiting..." << endl;   
  21.     exit(0);   
  22.     return ExceptionContinueExecution; //不會(huì)運(yùn)行到這   
  23. }   
  24.  
  25. int  g_div = 0;   
  26.  
  27. void bar()   
  28. {   
  29.     //初始化一個(gè)EXCEPTION_REGISTRATION結(jié)構(gòu)   
  30.     EXCEPTION_REGISTRATION reg, *preg = ?    
  31.     reg.handler = (DWORD)myHandler;   
  32.  
  33.     //取得當(dāng)前異常處理鏈的“頭”   
  34.     DWORD prev;   
  35.     _asm   
  36.     {   
  37.         mov EAX, FS:[0]   
  38.         mov prev, EAX   
  39.     }   
  40.     reg.prev = (EXCEPTION_REGISTRATION*) prev;   
  41.  
  42.     //注冊(cè)!   
  43.     _asm   
  44.     {   
  45.         mov EAX, preg   
  46.         mov FS:[0], EAX   
  47.     }  

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

【編輯推薦】

  1. C與C++中標(biāo)準(zhǔn)輸入實(shí)現(xiàn)方式上的一點(diǎn)區(qū)別
  2. C++編譯器如何對(duì)Const常量進(jìn)行分配存儲(chǔ)空間
  3. C++類庫設(shè)計(jì)的基本構(gòu)思與方法
  4. 玩轉(zhuǎn)C++語言的幾種方法
  5. 如何更好的進(jìn)行C++代碼編制

新聞標(biāo)題:C++編譯器如何實(shí)現(xiàn)異常處理
文章網(wǎng)址:http://www.dlmjj.cn/article/cdpesig.html