项目上为了应对程序异常崩溃的情况,加入了DUMP生成机制,也就是调用windows下的API SetUnhandledExceptionFilter()对未处理的异常安装了一个处理函数,在处理函数里面调用MiniDumpWriteDump()生成DUMP文件。这部分代码比较简单,但是在实际测试过程中,发现很多时候程序崩了之后并没有生成DUMP文件。在网上找了一些资料,有用的不多,当然也有很多大神的文档,譬如Matt Pietrek写的关于结构化异常的分析文章(链接:Matt Pietrek 讲解SEH的巨牛文章,留下来慢慢研究 - 认真做人,认真做事 - 博客园),这篇文章很好,里面有些东西不是短时间容易消化的,不过对于理解SEH确实是一份难得的学习资料。
下面是我再本地对异常捕获的一点测试结果。
在VS里面"启用C++异常"选项为"EHsc",并开启了Release编译优化的情况下:
1. try{}...catch{} 可以捕获C++异常(也就是通过throw抛出的异常),捕获不到SEH异常
2.__try{}...__except{} 可以捕获SEH异常,也可以捕获C++异常
如果将"启用C++异常"选项改为"EHa",try{}...catch{}可以捕获到SEH异常