青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

C++程序的異常處理技巧

  處理 C++ 中的異常會在語言級別上遇到少許隱含限制,但在某些情況下,您可以繞過它們。學習各種利用異常的方法,您就可以生產更可靠的應用程序。

  保留異常來源信息

  在C++中,無論何時在處理程序內捕獲一個異常,關于該異常來源的信息都是不為人知的。異常的具體來源可以提供許多更好地處理該異常的重要信息,或者提供一些可以附加到錯誤日志的信息,以便以后進行分析。

  為了解決這一問題,可以在拋出異常語句期間,在異常對象的構造函數中生成一個堆棧跟蹤。ExceptionTracer是示范這種行為的一個類。

  清單 1. 在異常對象構造函數中生成一個堆棧跟蹤

  // Sample Program:

  // Compiler: gcc 3.2.3 20030502

  // Linux: Red Hat

  #include

  #include

  #include

  #include

  using namespace std;

  /////////////////////////////////////////////

  class ExceptionTracer

  {

  public:

  ExceptionTracer()

  {

  void * array[25];

  int nSize = backtrace(array, 25);

  char ** symbols = backtrace_symbols(array, nSize);

   

  for (int i = 0; i < nSize; i++)

  {

  cout << symbols[i] << endl;

  }

  free(symbols);

  }

  };

  管理信號

  每當進程執行一個令人討厭的動作,以致于 Linux? 內核發出一個信號時,該信號都必須被處理。信號處理程序通常會釋放一些重要資源并終止應用程序。在這種情況下,堆棧上的所有對象實例都處于未破壞狀態。另一方面,如果這些信號被轉換成C++ 異常,那么您可以優雅地調用其構造函數,并安排多層 catch 塊,以便更好地處理這些信號。

  清單 2 中定義的 SignalExceptionClass,提供了表示內核可能發出信號的 C++ 異常的抽象。SignalTranslator 是一個基于 SignalExceptionClass 的模板類,它通常用來實現到 C++ 異常的轉換。在任何瞬間,只能有一個信號處理程序處理一個活動進程的一個信號。因此,SignalTranslator 采用了 singleton 設計模式。整體概念通過用于 SIGSEGV SegmentationFault 類和用于 SIGFPE FloatingPointException 類得到了展示。

  清單 2. 將信號轉換成異常

  template class SignalTranslator

  {

  private:

  class SingleTonTranslator

  {

  public:

  SingleTonTranslator()

  {

  signal(SignalExceptionClass::GetSignalNumber(),

  SignalHandler);

  }

  static void SignalHandler(int)

  {

  throw SignalExceptionClass();

  }

  };

  public:

  SignalTranslator()

  {

  static SingleTonTranslator s_objTranslator;

  }

  };

  // An example for SIGSEGV

  class SegmentationFault : public ExceptionTracer, public

  exception

  {

  public:

  static int GetSignalNumber() {return SIGSEGV;}

  };

  SignalTranslator

  g_objSegmentationFaultTranslator;

  // An example for SIGFPE

  class FloatingPointException : public ExceptionTracer, public

  exception

  {

  public:

  static int GetSignalNumber() {return SIGFPE;}

  };

  SignalTranslator

  g_objFloatingPointExceptionTranslator;

  管理構造函數和析構函數中的異常

  在全局(靜態全局)變量的構造和析構期間,每個 ANSI C++ 都捕獲到異常是不可能的。因此,ANSI C++ 不建議在那些其實例可能被定義為全局實例(靜態全局實例)的類的構造函數和析構函數中拋出異常。換一種說法就是永遠都不要為那些其構造函數和析構函數可能拋出異常的類定義全局(靜態全局)實例。不過,如果假定有一個特定編譯器和一個特定系統,那么可能可以這樣做,幸運的是,對于Linux 上的 GCC,恰好是這種情況。

  使用 ExceptionHandler 類可以展示這一點,該類也采用了 singleton 設計模式。其構造函數注冊了一個未捕獲的處理程序。因為每次只能有一個未捕獲的處理程序處理一個活動進程,構造函數應該只被調用一次,因此要采用 singleton 模式。應該在定義有問題的實際全局(靜態全局)變量之前定義 ExceptionHandler 的全局(靜態全局)實例。

  清單 3. 處理構造函數中的異常

  class ExceptionHandler

  {

  private:

  class SingleTonHandler

  {

  public:

  SingleTonHandler()

  {

  set_terminate(Handler);

  }

  static void Handler()

  {

  // Exception from construction/destruction of global variables try

  {

  // re-throw throw;

  }

  catch (SegmentationFault &)

  {

  cout << SegmentationFault << endl;

  }

  catch (FloatingPointException &)

  {

  cout << FloatingPointException << endl;

  }

  catch (...)

  {

  cout << Unknown Exception << endl;

  }

  //if this is a thread performing some core activity

  abort();

  // else if this is a thread used to service requests

  // pthread_exit();

  }

  };

  public:

  ExceptionHandler()

  {

  static SingleTonHandler s_objHandler;

  }

  };

  //////////////////////////////////////////////////////////////////////////

  class A

  {

  public:

  A()

  {

  //int i = 0, j = 1/i;

  *(int *)0 = 0;

  }

  };

  // Before defining any global variable, we define a dummy instance

  // of ExceptionHandler object to make sure that

  // ExceptionHandler::SingleTonHandler::SingleTonHandler() is

  invoked

  ExceptionHandler g_objExceptionHandler;

  A g_a;

  //////////////////////////////////////////////////////////////////////////

  int main(int argc, char* argv[])

  {

  return 0;

  }

  處理多線程程序中的異常

  有時一些異常沒有被捕獲,這將造成進程異常中止。不過很多時候,進程包含多個線程,其中少數線程執行核心應用程序邏輯,同時,其余線程為外部請求提供服務。如果服務線程因編程錯誤而沒有處理某個異常,則會造成整個應用程序崩潰。這一點可能是不受人們歡迎的,因為它會通過向應用程序傳送不合法的請求而助長拒絕服務攻擊。為了避免這一點,未捕獲處理程序可以決定是請求異常中止調用,還是請求線程退出調用。清單3 ExceptionHandler::SingleTonHandler::Handler() 函數的末尾處展示了該處理程序。

  結束語

  我簡單地討論了少許 C++ 編程設計模式,以便更好地執行以下任務:

  ·在拋出異常的時候追蹤異常的來源。

  ·將信號從內核程序轉換成 C++ 異常。

  ·捕獲構造和/或析構全局變量期間拋出的異常。

  ·多線程進程中的異常處理。

 

posted on 2008-11-09 18:08 肥仔 閱讀(382) 評論(0)  編輯 收藏 引用 所屬分類: C++ 基礎

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            美女精品视频一区| 亚洲第一天堂无码专区| 欧美日韩三级一区二区| 欧美中文在线观看| 亚洲韩国青草视频| 亚洲第一黄色网| 久久久午夜电影| 午夜电影亚洲| 久久久久久久久岛国免费| 香蕉久久夜色精品国产| **性色生活片久久毛片| 精品成人一区二区三区四区| 欧美日韩亚洲视频| 亚洲精品视频免费观看| 亚洲精品在线视频| 亚洲美女av在线播放| 亚洲天堂成人在线观看| 国产精品99久久久久久久久| 亚洲精品国产欧美| 欧美一区二区三区免费看| 亚洲视频中文| 国产综合视频| 国产一区在线免费观看| 国产一区二区三区免费不卡| 99精品热视频| 校园春色国产精品| 欧美一级视频免费在线观看| 亚洲综合清纯丝袜自拍| 久久在线免费| 欧美不卡高清| 这里是久久伊人| 久久精品中文字幕一区| 米奇777超碰欧美日韩亚洲| 欧美日一区二区在线观看 | 欧美91精品| 久久亚洲私人国产精品va媚药| 欧美激情2020午夜免费观看| 欧美喷潮久久久xxxxx| 国产精品久久久一区二区三区| 国产在线拍偷自揄拍精品| 久久综合国产精品| 亚洲国产精品国自产拍av秋霞| 亚洲人成绝费网站色www| 亚洲国产日韩一区二区| 久久国产黑丝| 欧美国产日韩一区二区| 国产精品久久久久久久久| 亚洲高清影视| 午夜视频精品| 欧美激情一区二区三区在线| 午夜欧美理论片| 每日更新成人在线视频| 国产精品扒开腿做爽爽爽视频 | 国产精一区二区三区| 亚洲区国产区| 亚洲欧美怡红院| 欧美二区视频| 久久久人人人| 国产精品色婷婷| 亚洲嫩草精品久久| 亚洲国产美女精品久久久久∴| 亚洲中午字幕| 国产精品久久久久久久一区探花 | 欧美在线影院| 欧美亚州韩日在线看免费版国语版| 国产欧美日韩精品专区| 亚洲欧洲一区二区天堂久久| 久久精品国产综合| 一区二区免费在线观看| 欧美日本精品在线| 亚洲高清视频一区| 亚洲最新合集| 亚洲欧洲在线看| 久久精品人人做人人爽电影蜜月 | 一本一本a久久| 久久在线免费| 毛片一区二区| 亚洲高清资源综合久久精品| 久久久欧美精品| 久久久欧美精品| 在线播放豆国产99亚洲| 老色鬼久久亚洲一区二区 | 欧美电影在线观看完整版| 狠狠网亚洲精品| 亚洲大片在线观看| 裸体女人亚洲精品一区| 狠狠久久五月精品中文字幕| 快播亚洲色图| 老司机免费视频一区二区| 欧美在线观看天堂一区二区三区 | 日韩一级大片| 欧美日韩在线三区| 亚洲视频在线观看| 中文在线不卡视频| 国产精品素人视频| 久久久.com| 久久亚洲精选| 亚洲视频一区二区在线观看 | 欧美一区二区三区四区高清| 亚洲视频网站在线观看| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 欧美成人一区在线| 亚洲美女在线观看| 亚洲在线免费视频| 国内不卡一区二区三区| 老巨人导航500精品| 欧美三区不卡| 午夜在线观看欧美| 亚洲欧美日本国产有色| 久久综合网络一区二区| 99riav久久精品riav| 最新国产拍偷乱拍精品| 国产性猛交xxxx免费看久久| 久久亚洲精品欧美| 国产精品三级久久久久久电影| 久久精品91| 模特精品在线| 久久综合中文字幕| 欧美日韩一二三区| 亚洲国产成人精品视频| 国产精品色婷婷久久58| 亚洲视频网在线直播| 免费不卡在线观看| 午夜性色一区二区三区免费视频| 欧美成人中文字幕| 欧美在线网站| 久久精品99| 亚洲欧美一区二区原创| 久久久久国产精品人| 欧美影院成人| 欧美日韩亚洲视频一区| 性做久久久久久久免费看| 欧美日韩1区2区| 久久久久久久久岛国免费| 国产精品一二一区| 亚洲三级免费| 亚洲第一黄网| 老牛国产精品一区的观看方式| 亚洲欧美精品中文字幕在线| 免费观看30秒视频久久| 欧美成人免费视频| 国产精品一区二区视频| 亚洲精品国产精品久久清纯直播| 另类av导航| 你懂的国产精品永久在线| 国产精品激情偷乱一区二区∴| 欧美激情在线播放| 亚洲激情精品| 欧美在线电影| 欧美亚洲视频| 国产亚洲在线| 亚洲欧美怡红院| 亚洲一级免费视频| 国产毛片一区二区| 在线亚洲自拍| 亚洲视频你懂的| 国产欧美综合在线| 亚洲在线视频| 欧美一区二区在线免费播放| 国产一区二区剧情av在线| 日韩亚洲欧美成人| 亚洲视频axxx| 国产精品久久久一区麻豆最新章节| 午夜在线观看欧美| 国产在线麻豆精品观看| 欧美专区日韩专区| 性欧美精品高清| 尤妮丝一区二区裸体视频| 欧美一区二区在线免费观看| 久久国产日韩| 亚洲国产精品一区二区第一页 | 国产性猛交xxxx免费看久久| 亚洲欧美日韩在线不卡| 久久成人精品视频| 亚洲国产精品一区在线观看不卡| 欧美精品七区| 欧美亚洲日本网站| 亚洲精品极品| 久久精品一区四区| 亚洲视频一区二区在线观看 | 欧美专区在线播放| 亚洲国产一区二区三区高清 | 国产精品网站在线播放| 久久一综合视频| 夜夜爽99久久国产综合精品女不卡| 性做久久久久久久免费看| 亚洲精品在线视频| 樱花yy私人影院亚洲| 国产精品国产亚洲精品看不卡15 | 久久午夜国产精品| 亚洲一区二区三区激情| 欧美激情精品| 久久亚洲精品一区二区| 午夜精品免费在线| 99在线|亚洲一区二区| 亚洲第一二三四五区| 国产欧美日韩精品专区| 国产精品久久久久国产精品日日| 女人香蕉久久**毛片精品| 久久激情五月婷婷|