· [Java论坛][安全论坛][数据库论坛][操作系统论坛]
· [访谈] 网银安全系列访谈之:惊心动魄网银故事
· [热点专题] 网银安全系列 3G上网卡巡礼
· [订阅IT技术周刊][IT资源下载专区][病毒求助专区]
· [热点] 跨站脚本十二问 四步防范Conficker
· [热点] Windows 7 RC版公开下载 憾缺中文版

Linux下C++程序的异常处理技巧 (3)

发布时间:2006.02.23 06:48     来源:51CTO    作者:unknown

管理构造函数和析构函数中的异常

在全局(静态全局)变量的构造和析构期间,每个 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++ 异常。

·捕获构造和/或析构全局变量期间抛出的异常。

·多线程进程中的异常处理。
(e129)

<<上一页 1 2 3


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 澄清 Java 的接口与继承机制 (01-04) · 如何在C/C++中调用Java (02-17)
· 微软下一代VS.NET开发包现形 (11-19) · Oracle欲将全部业务转到Linux (11-14)
· Borland推出移动版C++开发工具 (11-14) · 深入剖析WTL—WTL框架窗口分析 (11-11)
· 在可管理C++中封装值类型 (09-26) · 编程技巧20法 (09-20)
· 编程技巧20法之九:转换并保存位图 (09-20) · 编程技巧20法之八:将窗体复制到剪切板 (09-20)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
资讯 通信 IT产品 IT技术 信息化
2009第七届中国电脑商年会直播
·创业投资系列访谈:产业..
·特别策划:视频网站系列..
·专题:网游虚拟货币新规..
专题:6月上市手机新品回顾及7月新机展望
·2009年中国电信业信息化..
·专题:把iPhone 3GS“解..
·WAPI重启国际标准进程 ..
专题:09年中盘点-联想春季打印机新品回顾
·InfoComm 2009 视听与集..
·网游背后的故事 网游服..
·[专题]联想ThinkPad T40..
BizSpark:微软为技术创业企业点燃火花
·社区活动:我的IT求知生..
·访谈:内网安全2009系列..
·安全访谈:网银安全之Sa..