原文地址:http://blog.csdn.net/starlee/article/details/6613424

程序是由代码编译出来的,而代码是由人写的。人非圣贤,孰能无过。所以由人写的代码有缺陷是很正常的。当然很多异常都在开发阶段被考虑到而添加了处理代码,或者用try/catch对可能出现异常的地方进行额外的照顾。可是,还是会有一些无法预料的异常(Unhandled Exception)在程序运行的时候出现。这些异常很多时候都会招致程序的崩溃。那么有没有什么方法可以让程序在崩溃的时候体面的退出呢?答案是肯定的。可以用Windows API中的SetUnhandledExceptionFilter来设置一个回调函数来处理这些无法预料的异常。
        要想使用SetUnhandledExceptionFilter,必须#include <Windows.h>,这个函数的声明如下:

  1. LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(
  2. __in  LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
  3. );

具体的参数和返回值的解释可以查找MSDN,有很详细的说明。下面就用具体的代码来说明怎样使用这个Windows API来使程序在崩溃的时候体面的退出。代码里面有详细的注释来帮助理解。
        用VC创建一个名为Test的控制台程序,添加下面的代码。

  1. #include "stdafx.h"
  2. int _tmain(int argc, _TCHAR* argv[])
  3. {
  4. // 除零,人为的使程序崩溃
  5. //
  6. int i = 13;
  7. int j = 0;
  8. int k = i / j;
  9. return 0;
  10. }

编译上面的代码,到工程的Debug目录下找到编译好的Test.exe,双击运行,在Windows 7下就会出现下面的对话框告诉你程序无法运行,也就是崩溃了。

为了避免出现程序崩溃的情况,用前面所说的方法,把代码修改成下面这样。

  1. #include "stdafx.h"
  2. #include <Windows.h>
  3. // 处理Unhandled Exception的回调函数
  4. //
  5. LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
  6. {
  7. // 在这里添加处理程序崩溃情况的代码
  8. // 现在很多软件都是弹出一个发送错误报告的对话框
  9. // 这里以弹出一个错误对话框并退出程序为例子
  10. //
  11. FatalAppExit(-1,  _T("*** Unhandled Exception! ***"));
  12. return EXCEPTION_EXECUTE_HANDLER;
  13. }
  14. int _tmain(int argc, _TCHAR* argv[])
  15. {
  16. // 设置处理Unhandled Exception的回调函数
  17. //
  18. SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);
  19. // 除零,人为的使程序崩溃
  20. //
  21. int i = 13;
  22. int j = 0;
  23. int k = i / j;
  24. return 0;
  25. }

编译上面的代码,到工程的Debug目录下找到编译好的Test.exe,双击运行,就会出现下面这样的对话框,点击OK按钮后,程序正常退出。

[转]让程序在崩溃时体面的退出之Unhandled Exception的更多相关文章

  1. [转]让程序在崩溃时体面的退出之CallStack

    原文地址:http://blog.csdn.net/starlee/article/details/6618849 在我的那篇<让程序在崩溃时体面的退出之Unhandled Exception& ...

  2. [转]让程序在崩溃时体面的退出之SEH+Dump文件

    原文地址:http://blog.csdn.net/starlee/article/details/6649605 在我上篇文章<让程序在崩溃时体面的退出之SEH>中讲解了SEH中try/ ...

  3. [转]让程序在崩溃时体面的退出之Dump文件

    原文地址:http://blog.csdn.net/starlee/article/details/6630816 在我的那篇<让程序在崩溃时体面的退出之CallStack>中提供了一个在 ...

  4. 让程序在崩溃时体面的退出之Dump文件

             在我的那篇<让程序在崩溃时体面的退出之CallStack>中提供了一个在程序崩溃时得到CallStack的方法.但是要想得到CallStack,必须有pdb文件的支持.但 ...

  5. [转]让程序在崩溃时体面的退出之SEH

    原文地址:http://blog.csdn.net/starlee/article/details/6636723 SEH的全称是Structured Exception Handling,是Wind ...

  6. 编写的windows程序,崩溃时产生crash dump文件的办法

    一.引言 dump文件是C++程序发生异常时,保存当时程序运行状态的文件,是调试异常程序重要的方法,所以程序崩溃时,除了日志文件,dump文件便成了我们查找错误的最后一根救命的稻草.windows程序 ...

  7. android在程序崩溃时Catch异常并处理

    Android系统的"程序异常退出",给应用的用户体验造成不良影响.为了捕获应用运行时异常并给出友好提示,便可继承UncaughtExceptionHandler类来处理.通过Th ...

  8. 让linux中的程序崩溃时生成core文件

    当我们的linux程序崩溃的时候,常常会有这样的提示:    Segmentation fault (core dumped)    段错误 (核心已转储)    提示说生成了core文件,但是此功能 ...

  9. 使用SetUnhandledExceptionFilter转储程序崩溃时内存DMP .

    关于程序崩溃时转储内存DMP,可以设置注册表,使程序崩溃时自动转储内存DMP,见程序崩溃时利用注册表自动转储内存DMP.本文要介绍的是使用SetUnhandledExceptionFilter函数在程 ...

随机推荐

  1. WIN7 VMware Ubuntu虚拟机连接secureCRT及ftp传输文件

    一.安装vmware没有问题,网络设置以NAT方式(VMnet8是vmware专属的虚拟网卡).安装完毕后设置虚拟机的 VirtualNetworkEditor(可以再开始->所有程序VMwar ...

  2. Codevs 4768 跳石头 NOIP2015 DAY2 T1

    4768 跳石头 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 传送门 题目描述 Description 一年一度的"跳石头"比赛又要开始了! ...

  3. Linux系统update-alternatives命令使用

    个人博客地址:http://www.cnblogs.com/wdfwolf3/ update-alternatives是ubuntu系统用来进行软件版本切换的命令.比如系统中有几个版本的jdk,把这些 ...

  4. Google HTML/CSS/JS代码风格指南

    JS版本参见:http://www.zhangxinxu.com/wordpress/2012/07/google-html-css-javascript-style-guides/ HTML/CSS ...

  5. 深入理解QStateMachine与QEventLoop事件循环的联系与区别

    最近一直在倒腾事件循环的东西,通过查看Qt源码多少还是有点心得体会,在这里记录下和大家分享.总之,对于QStateMachine状态机本身来说,需要有QEventLoop::exec()的驱动才能支持 ...

  6. (一)跟我一起玩Linux网络服务:DNS服务——BIND(/etc/named.conf、/var/named)设置实现和解释

    2015年3月24更新 添加了要加的配置域名解析器(否则会找不到域名)     一.创建该实验的的模型   配置完gate虚拟机的两张网卡后,就启动gate的转发 [root@localhost ro ...

  7. mysql 中执行的 sql 注意字段之间的反向引号和单引号

    如下的数据表 create table `test`( `id` int(11) not null auto_increment primary key, `user` varchar(100) no ...

  8. mysql的数据类型int、bigint、smallint 和 tinyint取值范围 及varchar

    使用整数数据的精确数字数据类型.   bigint   从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字 ...

  9. c++清除输入缓冲区之 sync() vs ignore()

    最近在写程序的时候总是不注意输入缓冲区内是否还有东西,导致出现了一些异常,调试了半天.所以来上一贴,学习注意,引以为戒! http://blog.chinaunix.net/uid-21254310- ...

  10. VisualSVN Server 从此告别SVN记事本配置

    http://www.visualsvn.com/downloads/ 注意下载的是Server版本,他还会提供一个visual Studio的插件:   安装完毕后,可以在管理界面进行角色添加,创建 ...