成人免费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++聲明

2010-01-27 16:39:48

C++編譯器

2011-08-19 15:05:29

異常處理

2023-11-13 17:01:26

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++異常

2010-01-13 13:42:55

C++編譯器

2010-01-20 18:17:55

C++異常問題

2015-12-28 11:25:51

C++異常處理機制

2010-01-26 11:20:54

C++編輯器

2010-02-01 15:01:34

C++拋出異常
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲午夜精品在线观看 | 精品国产18久久久久久二百 | 日韩欧美精品在线 | 波多野结衣先锋影音 | 国产免费av在线 | 欧美一级免费看 | 精品久久久久久久久久久久久久 | www.中文字幕.com | 欧美成人一级 | 国产99久久精品一区二区永久免费 | www.天天操| 国产一区二区不卡 | 日韩视频观看 | 欧美日韩精品一区二区三区四区 | 一区二区精品视频 | 成人综合视频在线 | 亚洲日日操 | 视频二区在线观看 | 性高湖久久久久久久久 | 亚洲一区久久 | 久久天堂 | 久久最新 | 中文字幕 在线观看 | 欧美色成人| 中文字幕一区二区三区乱码在线 | 免费观看一级特黄欧美大片 | 欧美日韩一区在线 | 久青草影院 | 在线播放国产一区二区三区 | 中国一级特黄真人毛片免费观看 | 日韩免费视频一区二区 | 羞羞视频在线网站观看 | 日韩欧美在线视频 | 亚洲国产成人在线观看 | 国产91在线播放 | 国产高清一区二区 | 国产真实乱全部视频 | 亚洲成人av | 中文二区 | 精品一区二区三区在线观看 | 国产精品中文字幕一区二区三区 |