总结Windows程序的异常处理(dmp文件,防止崩溃)

总结一下上两篇文章,

一、如何像C#的try catch那样捕获Windows应用程序的所有异常。

首先要捕获的就是SEH异常,可以通过_set_se_translator把SEH异常转换成标准的C++异常,然后再调用_set_invalid_parameter_handler、_set_purecall_handler设置自己的异常处理函数(具体参考VS2005之后 _set_se_translator有可能不起作用),然后通过下面的代码结构就可以保证所有的异常都会被处理到,从而保证这一部分代码不会导致程序崩溃:

	//全局范围的
	_set_invalid_parameter_handler(myInvalidParameterHandler);
	_set_purecall_handler(myPurecallHandler);
	
	try
	{
		//当前线程范围内。要设置编译选项/EHa
		__set_se_translator(trans_func);
		
		//代码段
		//do something
	}
	catch(SEHException e)
	{
		//捕获到了SEH异常,写dmp文件
		WriteDumpFile(e.m_pExpInfo);
	}
	catch(...)
	{
		//为了捕获Invalid Parameter异常和purecall异常
	}


二、程序异常崩溃时的处理。

虽然上面保证了一段代码不会抛异常,但是程序很大的时候,crash再所难免,所以就需要对崩溃做处理。

通过SetUnhandledExceptionFilter和DisableSetUnhandledExceptionFilter(自己实现的,为了防止CRT修改异常处理函数,详见VS2005、VS2008中SetUnhandledExceptionFilter函数不起作用),这两个函数来处理程序中出现的未经处理的异常。通常情况下都是写dmp文件,便于调试问题所在。更高级的做法就是弹出CrashReport的窗体,将生成的dmp文件发送到服务器。不过这都是自己的异常处理函数的具体实现了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值