
#include <iostream>
using namespace std
/**********************************
//project ->Properties ->C/C++ ->Code Generation -->Enable C++ Exceptions
//选择 Yes with SEH Exceptions (/EHa) 这样的话C++的try catch 也可以捕获到空指针,内存越界,0除异常
//默认是选择Yes (/EHsc)
**********************************/
void TestIntType()
{
try
{
throw 1
}
catch(...)
{
cout<<"在 try block 中, 准备抛出一个异常." <<endl
}
}
void TestDoubleType()
{
try
{
throw 0.5
}
catch(...)
{
cout<<"在 try block 中, 准备抛出一个异常." <<endl
}
}
void TestEmptyPointType()
{
try
{
int* p = NULL
*p = 3
}
catch(...)
{
cout<<"非法地址 *** 作异常" <<endl
}
}
void TestDivZeroType()
{
try
{
int b = 0
int a = 3/b
}
catch(...)
{
cout<<"0除异常" <<endl
}
}
void TestMemoryOutType()
{
int * a = new int[4]
try
{
for (int i = 0i<245i++)
{
a++
}
*a = 3
}
catch(...)
{
cout<<"内存越界异常" <<endl
}
}
int main(int argc, char* argv[])
{
TestEmptyPointType()
//TestDivZeroType()
TestMemoryOutType()
return 1
}
有时候,希望程序退出时能进行一些处理,比如保存状态,释放一些资源。c语言开发的linux程序,有可能正常退出(exit),有可能异常crash,而异常crash可能是响应了某信号的默认处理。这里总结一下这些情况,如何获取一个统一的退出处理的点,说白了就是写一个回调函数,让他在程序正常或异常退出时调用。
这个例子里面其实是将异常退出处理和正常退出处理结合起来了。对于SIGTERM(即kill进程)和SIGINT(即ctrl-c结束前台进程),我们当做是正常退出,在其信号处理函数里面,直接调用了exit(0),而exit(0)又会被server_on_exit捕获到。对于异常退出也是类似,只是调用了exit(-1)表示是异常的。同时异常退出我们会打印出当前的进程堆栈信息,server_backtrace的实现下一篇再说。另外注意的是SIGKILL信号是无法捕获的。而调用abort导致的退出,也是通过SIGABRT信号捕获到进行处理了。其他几种异常退出的信号也是比较常见,一并捕获到进行处理。这样对于异常退出,我们即可统一的log堆栈信息,又可直接继续正常退出时的处理流程了。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)