成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析C++編譯器怎樣實(shí)現(xiàn)異常處理問題

開發(fā) 后端
與傳統(tǒng)語言相比,C++的一項(xiàng)革命性創(chuàng)新就是它支持異常處理。傳統(tǒng)的錯(cuò)誤處理方式經(jīng)常滿足不了要求,而異常處理則是一個(gè)極好的替代解決方案。它將正常代碼 和錯(cuò)誤處理代碼清晰的劃分開來,程序變得非常干凈并且容易維護(hù)。

在介紹C++編譯器如何實(shí)現(xiàn)異常處理的問題之前,先讓大家了解下什么是C++編譯器?其實(shí)C++編譯器是一個(gè)與標(biāo)準(zhǔn)化C++高度兼容的編譯環(huán)境,不同的編譯器也會(huì)對(duì)不同的CPU進(jìn)行不同的優(yōu)化。

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

  1. install_my_handler(); 

之后,程序中的所有異常,從它們被拋出到堆棧展開(stack unwinding),再到調(diào)用catch塊,***到程序恢復(fù)正常運(yùn)行,都將由我的異常處理庫來管理。

與其它C++特性一樣,C++標(biāo)準(zhǔn)并沒有規(guī)定編譯器應(yīng)該如何來實(shí)現(xiàn)異常處理。這意味著每一個(gè)編譯器的提供商都可以用它們認(rèn)為恰當(dāng)?shù)姆绞絹韺?shí)現(xiàn)它。下面我會(huì) 描述一下VC++是怎么做的,但即使你使用其它的編譯器或操作系統(tǒng)①,本文也應(yīng)該會(huì)是一篇很好的學(xué)習(xí)材料。VC++的實(shí)現(xiàn)方式是以windows系統(tǒng)的結(jié) 構(gòu)化異常處理(SEH)②為基礎(chǔ)的。

我認(rèn)為C++編譯器異常或者是被明確的拋出的,或者是由于除零溢出、空指針訪問等引起的。當(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. struct EXCEPTION_REGISTRATION  
  2. {  
  3.     EXCEPTION_REGISTRATION* prev;  
  4.     DWORD handler;  
  5. };  

注冊(cè)時(shí),只需要?jiǎng)?chuàng)建這樣一個(gè)結(jié)構(gòu),然后把它的地址放到FS段偏移0的位置上去就行了。下面這句匯編代碼演示了這一操作:

  1. mov FS:[0], exc_regp 

prev字段用于建立一個(gè)EXCEPTION_REGISTRATION結(jié)構(gòu)的鏈表,每次注冊(cè)新的EXCEPTION_REGISTRATION時(shí),我們都要把原來注冊(cè)的那個(gè)的地址存到prev中。那么,那個(gè)異常回調(diào)函數(shù)長什么樣呢?在excpt.h中,windows定義了它的原形:

  1. EXCEPTION_DISPOSITION (*handler)(   
  2. _EXCEPTION_RECORD *ExcRecord,   
  3. void* EstablisherFrame,   
  4. _CONTEXT *ContextRecord,   
  5. void* DispatcherContext);  

不要管它的參數(shù)和返回值,我們先來看一個(gè)簡(jiǎn)單的例子。下面的程序注冊(cè)了一個(gè)C++編譯器異常處理程序,然后通過除以零產(chǎn)生了一個(gè)異常。異常處理程序捕獲了它,打印了一條消息就完事大吉并退出了。

  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. }   
  48.  
  49. //產(chǎn)生一個(gè)異常   
  50. int  j = 10 / g_div;  //異常,除零溢出   
  51. }   
  52.  
  53. int  main()   
  54. {   
  55. bar();   
  56. return 0;   
  57. }  

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

【編輯推薦】

  1. 如何正確編寫C++項(xiàng)目開發(fā)編寫項(xiàng)目計(jì)劃書
  2. 對(duì)C++庫函數(shù)進(jìn)行學(xué)習(xí)探索總結(jié)筆記
  3. 深度演示C++語言的種種高安全性
  4. 詳細(xì)介紹如何準(zhǔn)確無誤的編寫C++語言
  5. 深度演示C++語言的種種高安全性
責(zé)任編輯:chenqingxiang 來源: 天極
相關(guān)推薦

2010-01-22 18:33:17

C++編譯器

2010-01-13 13:42:55

C++編譯器

2010-01-27 16:39:48

C++編譯器

2010-01-18 10:34:21

C++編譯器

2010-01-08 16:00:46

C++編譯器

2010-01-21 09:11:38

C++編譯器

2010-01-18 10:28:15

C++編譯器

2010-02-23 17:23:26

Python異常處理

2010-01-20 11:15:38

CC++編譯器

2010-10-20 13:43:37

C++編譯器

2010-01-14 15:29:44

C++編譯器

2010-02-03 13:14:03

C++編譯器命令

2015-03-23 10:04:43

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

2010-01-12 16:42:59

C++編譯器

2010-01-21 09:26:53

CC++編譯器

2009-08-04 15:52:58

ASP.NET編譯器

2009-07-06 12:49:33

JSP編譯器

2010-01-14 14:55:14

C++編譯器

2009-01-12 10:16:11

Visual C++編譯器選項(xiàng)設(shè)置

2010-01-27 14:48:55

優(yōu)秀C++編譯器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久草视频网站 | 在线观看深夜视频 | 精品免费视频 | 极品电影院 | 免费网站在线 | 国产精品美女久久久久久免费 | 亚洲欧洲精品一区 | 亚洲欧美一区二区三区在线 | 欧美成人精品一区二区男人看 | 毛片毛片毛片毛片毛片 | 男人天堂网址 | 国产成人在线看 | 欧美一页| 日韩在线观看中文字幕 | 精品一二三区视频 | 中文字幕视频在线免费 | 欧美日韩国产在线 | 性国产xxxx乳高跟 | 成人影视网 | 黄视频国产| 盗摄精品av一区二区三区 | 超碰97免费观看 | 国产精品一卡二卡三卡 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 久久成人一区 | 午夜免费福利影院 | 久久综合九色综合欧美狠狠 | 午夜精品久久久久久久久久久久久 | 国产黄色大片在线观看 | 男女免费在线观看视频 | 99精品免费| 欧美另类视频 | 精品国产乱码久久久久久蜜柚 | 欧美日韩国产精品一区 | 黄色在线免费观看视频 | 日韩在线观看视频一区 | 国产色网 | 亚洲人精品午夜 | 免费在线观看一区二区三区 | 玖玖国产 | 亚洲成人精品 |