自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C++編譯器如何實現(xiàn)異常處理

開發(fā) 后端
C++編譯器新的一項革命性創(chuàng)新就是它支持異常處理,傳統(tǒng)的錯誤處理方式經(jīng)常滿足不了要求,而異常處理則是一個極好的替代解決方案。

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

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

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


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

這意味著每一個C++編譯器的提供商都可以用它們認為恰當?shù)姆绞絹韺崿F(xiàn)它。下面我會描述一下VC++是怎么做的,但即使你使用其它的C++編譯器或操作系統(tǒng)①,本文也應該會是一篇很好的學習材料。

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

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

  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; //不會運行到這   
  23. }   
  24.  
  25. int  g_div = 0;   
  26.  
  27. void bar()   
  28. {   
  29.     //初始化一個EXCEPTION_REGISTRATION結(jié)構   
  30.     EXCEPTION_REGISTRATION reg, *preg = ®    
  31.     reg.handler = (DWORD)myHandler;   
  32.  
  33.     //取得當前異常處理鏈的“頭”   
  34.     DWORD prev;   
  35.     _asm   
  36.     {   
  37.         mov EAX, FS:[0]   
  38.         mov prev, EAX   
  39.     }   
  40.     reg.prev = (EXCEPTION_REGISTRATION*) prev;   
  41.  
  42.     //注冊!   
  43.     _asm   
  44.     {   
  45.         mov EAX, preg   
  46.         mov FS:[0], EAX   
  47.     }  

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

【編輯推薦】

  1. C與C++中標準輸入實現(xiàn)方式上的一點區(qū)別
  2. C++編譯器如何對Const常量進行分配存儲空間
  3. C++類庫設計的基本構思與方法
  4. 玩轉(zhuǎn)C++語言的幾種方法
  5. 如何更好的進行C++代碼編制
責任編輯:chenqingxiang 來源: 51CTO.com
相關推薦

2010-01-22 18:33:17

C++編譯器

2010-01-13 13:42:55

C++編譯器

2010-01-12 17:26:37

C++編譯器

2010-01-14 15:29:44

C++編譯器

2010-01-18 10:34:21

C++編譯器

2010-01-21 09:11:38

C++編譯器

2010-01-18 10:28:15

C++編譯器

2010-10-20 13:43:37

C++編譯器

2010-02-03 13:14:03

C++編譯器命令

2015-03-23 10:04:43

c++編譯器c++實現(xiàn)原理總結(jié)

2010-01-12 16:42:59

C++編譯器

2010-01-19 13:01:32

C++數(shù)據(jù)類型

2023-11-15 17:58:58

C++代碼

2010-01-21 09:26:53

CC++編譯器

2009-01-12 10:16:11

Visual C++編譯器選項設置

2010-01-14 14:55:14

C++編譯器

2010-01-27 14:48:55

優(yōu)秀C++編譯器

2010-01-27 15:29:45

C++異常處理

2010-01-08 16:00:46

C++編譯器

2012-02-09 09:14:32

C++
點贊
收藏

51CTO技術棧公眾號