Windows结构性异常处理封装类

 

学习软件工程时有句老话,“不存在没有错误的程序”,十余年历练,各种错误如影随行一如鬼魅,由此看真理是不需要检验的,你只需要信仰就可以了。


Windows的程序员对于上图应用程序崩溃的对话框应该再熟悉不过,这是所谓的结构性异常的默认处理方式。空指针读写、数组越界、除零错误、溢出等严重错误,Windows都将产生结构性异常。由于MFC的框架并不提供结构性异常的封装,所以无论使用SDK或者MFC的程序员都必须面对结构性异常。针对错误,当然你要做的大抵三个层次:

(1)、捕捉错误,定位错误,并事后纠正错误。

(2)运行中如非致命性错误,忽略错误,维持程序带病运行。

(3)、当然你足够水平,最好是补救错误,维持程序正确运行。

我日常工作写的最多的是24小时运行的后台值守程序,所以持续运行很关键,但也很困难。目前我只做前两点,有时尝试做第三点,所以写了段代码在捕捉结构性错误的同时,利用dbghelpimagehlp.dll的调试函数产生内存Dump文件,并产生文本文件捕捉一些相关信息用于定位错误。并将结构性异常转换为C++异常,以期维持程序继续运行。对于可预见的关键代码段做一些保护性工作,以期能够补救错误。

以往的做法将结构性异常 处理代码在各个项目拷来拷去再适当修改,时间久了、项目多了也觉得不好。去年打包了一下,有改动,所有的项目可以一起升级,规范一些。今天略作整理、精 简,希望和有需要的朋友分享。技术上是简单的,用起来也挺简单,可以解决大家一些敲键盘的时间。专业度高的、熟悉结构性异常的朋友可以跳过,不用浪费时 间,没接触过的朋友可以看看代码,代码是最能说明问题的,应该有些益处。至于结构性异常的知识俺就不介绍了,网络上多如牛毛。

之所以贴出来,就因为使用简单,举例说明如下,一般应用(seh.h 下载链接 SEH头文件):

将结构性异常转换为C++标准异常:

有启用捕捉功能当然也要有停用功能:

用户自行定制部分。封装一定要注意将变化部分暴露出来。结构性异常处理两个关键事项,一个是生产什么样的报告文件,二是转换为哪个标准的C++异常,所以我在这里用两个模板参数提供变化策略:

简单定制,替换模板参数即可,复杂的就需要扩展编写新的类。

其他注意事项:
如果需将结构性异常转换为C++异常,应在编译参数中添加/EHa,这样做是为了避免VC优化器当检测不到抛出异常语句,会将捕捉语句优化去除,比如

多线程程序将结构性异常转换为C++异常,必须在每一个线程入口点加入SEH<>::DoCatchCpp(); 而SEH<>::DoCatch();整个程序只需一个 。

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值