在全局(静态全局)变量的构造和析构期间,每个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;
}
处理多线程程序中的异常
: 网友原创:从N层到.NET详细剖析原理
本文章共:3页
[2]
views:(0) | Comments:(0) | |
相关内容: