总结一下上两篇文章,
一、如何像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文件发送到服务器。不过这都是自己的异常处理函数的具体实现了。