总结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文件发送到服务器。不过这都是自己的异常处理函数的具体实现了。

展开阅读全文

没有更多推荐了,返回首页