Visual C 提供了对C语言、C 语言及MFC的支持,因而其涉及到的异常(exception)处理也包含了这三种类型,即C语言、C 语言和MFC的异常处理。除此之外,微软对C和C 的异常处理进行了扩展,提出了结构化异常处理(SEH)的概念,它支持C和C (与之相比,MFC异常处理仅支持C )。
一个典型的异常处理包含如下几个步骤:
(1)程序执行时发生错误;
(2)以一个异常对象(最简单的是一个整数)记录错误的原因及相关信息;
(3)程序检测到这个错误(读取异常对象);
(4)程序决定如何处理错误;
(5)进行错误处理,并在此后恢复/终止程序的执行。
C、C 、MFC及SEH在这几个步骤中表现出了不同的特点。本文将对这四种异常处理进行介绍,并对它们进行对比分析。本文例程的调试平台为Visual C 6.0,操作系统为Windows XP,所有程序均调试通过。
在进入正式的讲解之前,先说几句废话。许多的编程新手对异常处理视而不见,程序里很少考虑异常情况。一部分人甚至根本就不考虑,以为程序总是能以正确的途径运行。譬如我们有的程序设计者调用fopen打开一个文件后,立马就开始进行读写操作,根本就不考虑文件是否正常打开了。这种习惯一定要改掉,纵使你再不愿意!这是软件健壮性的需要!异常处理不是浪费时间!
1.C语言异常处理
1.1 异常终止
标准C库提供了abort()和exit()两个函数,它们可以强行终止程序的运行,其声明处于<stdlib.h>头文件中。这两个函数本身不能检测异常,但在C程序发生异常后经常使用这两个函数进行程序终止。下面的这个例子描述了exit()的行为:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
exit(EXIT_SUCCESS);
printf("程序不会执行到这里\n");
return 0;
}
在这个例子中,main函数一开始就执行了exit函数(此函数原型为void exit(int)),因此,程序不会输出"程序不会执行到这里"。程序中的exit(EXIT_SUCCESS)表示程序正常结束,与之对应的exit(EXIT_FAILURE)表示程序执行错误,只能强行终止。EXIT_SUCCESS、EXIT_FAILURE分别定义为0和1。
对于exit函数,我们可以利用atexit函数为exit事件"挂接"另外的函数,这种"挂接"有点类似Windows编程中的"钩子"(Hook)。譬如:
#include <stdio.h>
#include <stdlib.h>
static void atExitFunc(void)
{
printf("atexit挂接的函数\n");
}
int main(void)
{
atexit(atExitFunc);
exit(EXIT_SUCCESS);
printf("程序不会执行到这里\n");
return 0;
}
程序输出"atexit挂接的函数"后即终止。来看下面的程序,我们不调用exit函数,看看atexit挂接的函数会否执行:
#include <stdio.h>
#include <stdlib.h>
static void atExitFunc(void)
{
printf("atexit挂接的函数\n");
}
int main(void)
{
atexit(atExitFunc);
//exit(EXIT_SUCCESS);
printf("不调用exit函数\n");
return 0;
}
程序输出:
不调用exit函数
atexit挂接的函数
这说明,即便是我们不调用exit函数,当程序本身退出时,atexit挂接的函数仍然会被执行。
atexit可以被多次执行,并挂接多个函数,这些函数的执行顺序为后挂接的先执行,例如:
#include <stdio.h>
#include <stdlib.h>
static void atExitFunc1(void)
{
printf("atexit挂接的函数1\n");
}
static void atExitFunc2(void)
{
printf("atexit挂接的函数2\n");
}
static void atExitFunc3(void)
{
printf("atexit挂接的函数3\n");
}
int main(void)
{
atexit(atExitFunc1);
atexit(atExitFunc2);
atexit(atExitFunc3);
return 0;
}
输出的结果是:
atexit挂接的函数3
atexit挂接的函数2
atexit挂接的函数1
在Visual C 中,如果以abort函数(此函数不带参数,原型为void abort(void))终止程序,则会在debug模式运行时弹出如图1所示的对话框。

图1 以abort函数终止程序
1.2 断言(assert)
assert宏在C语言程序的调试中发挥着重要的作用,它用于检测不会发生的情况,表明一旦发生了这样的情况,程序就实际上执行错误了,例如strcpy函数:
char *strcpy(char *strDest, const char *strSrc)
{
char *address = strDest;
assert((strDest != NULL) && (strSrc != NULL));
while ((*strDest = *strSrc ) != ’\0’)
;
return address;
}
其中包含断言assert( (strDest != NULL) && (strSrc != NULL) ),它的意思是源和目的字符串的地址都不能为空,一旦为空,程序实际上就执行错误了,会引发一个abort。
assert宏的定义为:
#ifdef NDEBUG
#define assert(exp) ((void)0)
#else
#ifdef __cplusplus
extern "C"
{
#endif
_CRTIMP void __cdecl _assert(void *, void *, unsigned);
#ifdef __cplusplus
}
#endif
#define assert(exp) (void)( (exp) || (_assert(#exp, __FILE__, __LINE__), 0) )
#endif /* NDEBUG */
如果程序不在debug模式下,assert宏实际上什么都不做;而在debug模式下,实际上是对_assert()函数的调用,此函数将输出发生错误的文件名、代码行、条件表达式。例如下列程序:
#include <stdio.h>
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关文章
热点关注
- C 的面试题哦~
- hd7279键盘显示芯片c51代
- C语言的常用库函数使用方
- 什么是迭代跟递归算法?
- c#中父窗口和子窗口之间
- c#结合串口通信类实现串
- c#利用正则表达式实现字
- 用visual c#中轻松浏览
- C语言的常用库函数使用方
- C语言面试题大汇总之华为
- c#.net网络程式研发-sock
- c#实现smtp服务器,使用t
- C语言图像处理
- 如何自画ListView的Item(
- Linux下C语言编程基础知
- C 中对浮点数的格式化显
- 用c#实现由15位身份证号
- Windows Mobile 研发常见
- 在Visual C 中使用fopen
- Linux on POWER 中的 GNU
- uC/OS-II在ARM系统上的移
- C 嵌入式系统中应用
- C/C 中动态链接库的创建
- 关于c#中的datetime类型
- 用c#实现智能设备上的not
- C 中的指针(三) 智能指
- ASP.NET中使用TreeView控
- 使用c#创建sql server的
- C 中的动态多维数组
- c# enum设计和使用的相关
- Visual C /MFC入门教程
- 获取WinNT/Win2k当前用户
- 实现ComboBox输入文字的
- excel 2007单元格及内容
- C语言经典100例(一)
IDC资讯
虚拟主机
域名注册
托管租用
vps主机
智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD




