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

C++異常處理幾大秘訣

開發 后端
也許大家對與C++異常處理還不是很了解,看完本文后對您一定會大有幫助,下文除了學習C++異常處理的基本性質外還對C++異常處理的新特性進行全面研究。

在調用catch塊之前,把當前異常保存在exception_storage對象中,并注冊一個專用于catch塊的異常處理程序,,C++異常處理程序必須繼續傳就能得到exception_storage對象。

現在重新回到C++異常處理這個主題上來。調用catch塊時,它可能重新拋出異常或拋出新異常。前一種情況下,C++異常處理程序必須繼續傳播 (propagate)當前異常;后一種情況下,它需要在繼續之前銷毀原來的異常。

此時,處理程序要面對兩個難題:"如何知道異常是源于catch塊還是 程序的其他部分"和"如何跟蹤原來的異常"。我的解決方法是:在調用catch塊之前,把當前異常保存在exception_storage對象中,并注 冊一個專用于catch塊的C++異常處理程序——catch_block_protector。調用get_exception_storage()函數,就能得到exception_storage對象:

  1. namespace my_handler   
  2. {   
  3.     __declspec(dllexport) exception_storage* get_exception_storage() throw ()   
  4.     {   
  5.         void * p = TlsGetValue(dwstorage);   
  6.         return reinterpret_cast (p);   
  7.     }   
  8. }   
  9.  
  10.  
  11. BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )   
  12. {   
  13.     using my_handler::exception_storage;   
  14.     exception_storage *p;   
  15.     switch (ul_reason_for_call)   
  16.     {   
  17.     case DLL_PROCESS_ATTACH:   
  18.         //主線程(第一個線程)不會收到DLL_THREAD_ATTACH通知,所以,   
  19.         //與其相關的操作也放在這了   
  20.         dwstorage = TlsAlloc();   
  21.         if (-1 == dwstorage)   
  22.             return FALSE;   
  23.         p = new exception_storage();   
  24.         TlsSetValue(dwstorage, p);   
  25.         break ;   
  26.     case DLL_THREAD_ATTACH:   
  27.         p = new exception_storage();   
  28.         TlsSetValue(dwstorage, p);   
  29.         break;    
  30.     case DLL_THREAD_DETACH:   
  31.         p = my_handler::get_exception_storage();   
  32.         delete p;   
  33.         break ;   
  34.     case DLL_PROCESS_DETACH:   
  35.         p = my_handler::get_exception_storage();   
  36.         delete p;   
  37.         break ;   
  38.     }   
  39.     return TRUE;   
  40. }  

這樣,當catch塊(重新)拋出異常時,程序將會執行catch_block_protector。如果是拋出了新異常,這個函數可以從 exception_storage對象中分離出前一個異常并銷毀它;如果是重新拋出原來的異常(可以通過ExceptionInformation數組 的前兩個元素知道是新異常還是舊異常,后一種情況下著兩個元素都是0,參見下面的代碼),就通過拷貝ExceptionInformation數組來繼續 傳播它。下面的代碼就是catch_block_protector()函數的實現。

在單線程程序中,這是一個完美的實現。但在多線程中,這就是個災難了,想象一下多個線程訪問它,并把異常對象保存在里面的情景吧。由于每個線程都有自己的 堆棧和C++異常處理鏈,我們需要一個線程安全的get_exception_storage實現:

每個線程都有自己單獨的 exception_storage,它在線程啟動時被創建,并在結束時被銷毀。Windows提供的線程局部存儲(thread local storage,TLS)可以滿足這個要求,它能讓每個線程通過一個全局鍵值來訪問為這個線程所私有的對象副本,這是通過TlsGetValue()和 TlsSetValue這兩個API來完成的。

Excptstorage.cpp中給出了get_exception_storage()函數的實現。它會被編譯成動態鏈接庫,因為我們可以籍此知道線 程的創建和退出——系統在這兩種情況下都會調用所有(當前進程加載的)dll的DllMain()函數,這讓我們有機會創建特定于線程的數據,也就是 exception_storage對象。

【編輯推薦】

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

2010-01-27 15:29:45

C++異常處理

2010-01-26 17:27:58

C++C程序

2011-05-13 18:10:55

CC++

2021-03-25 07:44:39

C++異常處理開發技術

2011-03-31 09:30:07

CC++聲明

2011-08-19 15:05:29

異常處理

2023-11-13 17:01:26

C++編程

2010-01-27 16:39:48

C++編譯器

2010-01-14 09:55:30

C++標準庫

2010-01-25 18:05:40

C++語言

2019-10-15 14:53:05

物聯網技術設計

2024-01-22 13:05:00

C++編程異常處理

2010-01-22 18:33:17

C++編譯器

2010-01-11 10:01:25

C++的編程工具

2010-02-02 11:16:28

C++異常

2015-12-28 11:25:51

C++異常處理機制

2010-01-13 13:42:55

C++編譯器

2010-01-20 18:17:55

C++異常問題

2010-01-26 11:20:54

C++編輯器

2010-02-01 15:01:34

C++拋出異常
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美11一13sex性hd | 有码一区 | 91久久国产综合久久 | 欧美日一区二区 | 亚洲精品乱码久久久久久按摩观 | 懂色av蜜桃av | 成人在线视频网址 | 国产精品99久久久久久动医院 | 欧美精品91| 一级片在线视频 | 亚洲欧美视频在线观看 | 天天夜夜操 | 国产精品视频久久 | 久久精品在线播放 | 亚洲视频在线看 | 国产精品久久毛片av大全日韩 | 国内精品视频一区二区三区 | 亚洲精品2| 九色在线观看 | 日韩精品一区二区三区视频播放 | 日韩在线成人 | 国产一区二区高清在线 | 亚洲永久| 久久精品69 | 中文字幕韩在线第一页 | 一级毛片免费看 | 国产精品久久久久久久7777 | 久久久久亚洲精品国产 | 久久小视频 | 日韩一区二区三区在线 | 免费国产视频 | 亚洲欧美另类在线观看 | 97人人超碰| 在线观看国产视频 | 成人网视频 | 国产午夜在线 | 一级全黄视频 | 免费观看黄色一级片 | 97精品久久 | 日本不卡在线观看 | 男人影音 |