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

woaidongmao

文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
數(shù)據(jù)加載中……

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

  處理 C++ 中的異常會(huì)在語(yǔ)言級(jí)別上遇到少許隱含限制,但在某些情況下,您可以繞過(guò)它們。學(xué)習(xí)各種利用異常的方法,您就可以生產(chǎn)更可靠的應(yīng)用程序。

  保留異常來(lái)源信息

  在C++中,無(wú)論何時(shí)在處理程序內(nèi)捕獲一個(gè)異常,關(guān)于該異常來(lái)源的信息都是不為人知的。異常的具體來(lái)源可以提供許多更好地處理該異常的重要信息,或者提供一些可以附加到錯(cuò)誤日志的信息,以便以后進(jìn)行分析。

  為了解決這一問(wèn)題,可以在拋出異常語(yǔ)句期間,在異常對(duì)象的構(gòu)造函數(shù)中生成一個(gè)堆棧跟蹤。ExceptionTracer是示范這種行為的一個(gè)類。

  清單 1. 在異常對(duì)象構(gòu)造函數(shù)中生成一個(gè)堆棧跟蹤

  // 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);

  }

  };

  管理信號(hào)

  每當(dāng)進(jìn)程執(zhí)行一個(gè)令人討厭的動(dòng)作,以致于 Linux? 內(nèi)核發(fā)出一個(gè)信號(hào)時(shí),該信號(hào)都必須被處理。信號(hào)處理程序通常會(huì)釋放一些重要資源并終止應(yīng)用程序。在這種情況下,堆棧上的所有對(duì)象實(shí)例都處于未破壞狀態(tài)。另一方面,如果這些信號(hào)被轉(zhuǎn)換成C++ 異常,那么您可以優(yōu)雅地調(diào)用其構(gòu)造函數(shù),并安排多層 catch 塊,以便更好地處理這些信號(hào)。

  清單 2 中定義的 SignalExceptionClass,提供了表示內(nèi)核可能發(fā)出信號(hào)的 C++ 異常的抽象。SignalTranslator 是一個(gè)基于 SignalExceptionClass 的模板類,它通常用來(lái)實(shí)現(xiàn)到 C++ 異常的轉(zhuǎn)換。在任何瞬間,只能有一個(gè)信號(hào)處理程序處理一個(gè)活動(dòng)進(jìn)程的一個(gè)信號(hào)。因此,SignalTranslator 采用了 singleton 設(shè)計(jì)模式。整體概念通過(guò)用于 SIGSEGV SegmentationFault 類和用于 SIGFPE FloatingPointException 類得到了展示。

  清單 2. 將信號(hào)轉(zhuǎn)換成異常

  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;

  管理構(gòu)造函數(shù)和析構(gòu)函數(shù)中的異常

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

  使用 ExceptionHandler 類可以展示這一點(diǎn),該類也采用了 singleton 設(shè)計(jì)模式。其構(gòu)造函數(shù)注冊(cè)了一個(gè)未捕獲的處理程序。因?yàn)槊看沃荒苡幸粋€(gè)未捕獲的處理程序處理一個(gè)活動(dòng)進(jìn)程,構(gòu)造函數(shù)應(yīng)該只被調(diào)用一次,因此要采用 singleton 模式。應(yīng)該在定義有問(wèn)題的實(shí)際全局(靜態(tài)全局)變量之前定義 ExceptionHandler 的全局(靜態(tài)全局)實(shí)例。

  清單 3. 處理構(gòu)造函數(shù)中的異常

  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;

  }

  處理多線程程序中的異常

  有時(shí)一些異常沒(méi)有被捕獲,這將造成進(jìn)程異常中止。不過(guò)很多時(shí)候,進(jìn)程包含多個(gè)線程,其中少數(shù)線程執(zhí)行核心應(yīng)用程序邏輯,同時(shí),其余線程為外部請(qǐng)求提供服務(wù)。如果服務(wù)線程因編程錯(cuò)誤而沒(méi)有處理某個(gè)異常,則會(huì)造成整個(gè)應(yīng)用程序崩潰。這一點(diǎn)可能是不受人們歡迎的,因?yàn)樗鼤?huì)通過(guò)向應(yīng)用程序傳送不合法的請(qǐng)求而助長(zhǎng)拒絕服務(wù)攻擊。為了避免這一點(diǎn),未捕獲處理程序可以決定是請(qǐng)求異常中止調(diào)用,還是請(qǐng)求線程退出調(diào)用。清單3 ExceptionHandler::SingleTonHandler::Handler() 函數(shù)的末尾處展示了該處理程序。

  結(jié)束語(yǔ)

  我簡(jiǎn)單地討論了少許 C++ 編程設(shè)計(jì)模式,以便更好地執(zhí)行以下任務(wù):

  ·在拋出異常的時(shí)候追蹤異常的來(lái)源。

  ·將信號(hào)從內(nèi)核程序轉(zhuǎn)換成 C++ 異常。

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

  ·多線程進(jìn)程中的異常處理。

 

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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看| 欧美一区二区三区四区在线观看地址| 亚洲一区一卡| 性做久久久久久久久| 久久性色av| 亚洲精品欧洲| 欧美在线观看日本一区| 欧美成人综合| 国产精品日韩欧美| 亚洲成色精品| 亚洲欧美日韩国产中文在线| 快播亚洲色图| av成人天堂| 久久久欧美一区二区| 欧美日韩在线电影| 在线日韩中文字幕| 亚洲欧美综合国产精品一区| 欧美不卡福利| 亚洲欧美日韩精品久久久久| 蜜桃久久av一区| 国产美女精品人人做人人爽| 亚洲激情图片小说视频| 欧美一区二区三区在线观看视频| 久久久免费av| 亚洲私人影院| 欧美理论在线| 最新国产成人在线观看| 久久视频国产精品免费视频在线| 欧美国产日韩一区二区三区| 亚久久调教视频| 欧美视频在线不卡| 日韩视频一区二区三区在线播放免费观看 | 亚洲美女91| 亚洲一区日韩在线| 亚洲黄色性网站| 欧美一区二区国产| 国产精品一区二区你懂得| 中文一区二区| 久久综合九色综合久99| 香港成人在线视频| 国产精品国产成人国产三级| 日韩视频免费观看| 亚洲国产精品成人| 麻豆久久久9性大片| 国内不卡一区二区三区| 午夜综合激情| 久久国产精品99国产| 99www免费人成精品| 免费在线成人| 亚洲级视频在线观看免费1级| 一本色道久久综合亚洲91| 欧美国产精品人人做人人爱| 久久五月激情| 亚洲国产视频一区| 欧美不卡视频一区发布| 久久av二区| 黑人操亚洲美女惩罚| 久久久噜噜噜久久久| 久久精品亚洲精品| 亚洲二区视频| 91久久精品国产91久久| 欧美激情精品久久久久久免费印度| 激情婷婷亚洲| 欧美高清你懂得| 欧美国产日本在线| 亚洲午夜羞羞片| 亚洲欧美一区二区三区久久| 在线成人激情视频| 亚洲人成网站色ww在线| 国产精品久久久久久久久久久久| 夜夜嗨av一区二区三区中文字幕 | 国产精品99久久久久久白浆小说| 欧美日韩国产免费| 亚洲专区欧美专区| 久久精品二区| 亚洲精品乱码久久久久久黑人| 欧美激情区在线播放| 欧美日韩免费观看一区| 欧美一级大片在线免费观看| 久久久久综合一区二区三区| 亚洲久久一区二区| 亚洲综合精品| 亚洲欧洲在线一区| 亚洲一区二区视频| 亚洲国产视频直播| 亚洲自拍电影| 亚洲精品久久久久久下一站 | 亚洲欧美国产视频| 亚洲国产一二三| 中国成人亚色综合网站| 一区二区在线视频| 一本色道久久99精品综合| 国产婷婷一区二区| 亚洲精品在线视频观看| 激情伊人五月天久久综合| 亚洲日本无吗高清不卡| 国产自产2019最新不卡| 亚洲视频福利| 欧美在线免费播放| 欧美黑人一区二区三区| 午夜精品www| 欧美xx69| 久久一区免费| 国产美女在线精品免费观看| 亚洲黄色精品| 国产中文一区| 亚洲一区欧美| 一区二区日韩伦理片| 免费观看在线综合| 久久青草久久| 国产欧美精品xxxx另类| 亚洲最新合集| 日韩视频三区| 蜜乳av另类精品一区二区| 久久久久国产精品麻豆ai换脸| 麻豆国产精品777777在线| 久久国产精品99国产| 国产精品久久久久久久9999| 99在线精品观看| 亚洲视频一区二区免费在线观看| 欧美综合国产| 久久久之久亚州精品露出| 国产精品中文字幕在线观看| 亚洲视频第一页| 亚洲男人av电影| 国产精品s色| 一区二区福利| 午夜精品久久久久99热蜜桃导演| 欧美精品系列| 亚洲精品资源美女情侣酒店| 亚洲免费成人av| 欧美成人在线影院| 亚洲国产精品久久久| 亚洲另类在线视频| 欧美片第一页| 亚洲私拍自拍| 久久av资源网| 国产字幕视频一区二区| 久久久蜜桃一区二区人| 欧美激情综合| 一区二区不卡在线视频 午夜欧美不卡在 | 麻豆精品精品国产自在97香蕉| 欧美激情综合在线| 亚洲人线精品午夜| 亚洲视频一区二区| 国产精品成人免费| 亚洲欧美激情四射在线日 | 亚洲精品久久久久久久久| 欧美不卡高清| 亚洲精品无人区| 亚洲色诱最新| 亚洲电影在线免费观看| 嫩草伊人久久精品少妇av杨幂| 免费不卡视频| 日韩西西人体444www| 国产精品激情电影| 欧美一区二区三区免费观看 | 欧美电影资源| 一区二区动漫| 国产资源精品在线观看| 欧美成人在线网站| 亚洲天堂男人| 欧美激情精品久久久久| 亚洲欧美国产日韩中文字幕| 国产自产女人91一区在线观看| 久久久久久午夜| 日韩午夜免费| 免费高清在线视频一区·| 一区二区三区高清不卡| 国产一区美女| 欧美午夜www高清视频| 久久在线免费| 亚洲欧美精品| 日韩一级精品| 免费一级欧美在线大片| 亚洲欧美久久| 最新亚洲一区| 黄色成人在线网址| 国产精品久久久久高潮| 欧美大片在线观看| 久久成人精品| 亚洲一区二区视频在线观看| 亚洲国产精品va在看黑人| 久久久久99| 午夜亚洲伦理| 亚洲一区二区少妇| 99re8这里有精品热视频免费 | 国产精品成人aaaaa网站| 久久深夜福利免费观看| 亚洲欧美视频在线| 亚洲视频电影图片偷拍一区| 亚洲激情欧美| 欧美国产第二页| 久久亚洲春色中文字幕|