VS2010/MFC编程入门之四十六(MFC常用类:MFC异常处理)
上一节中鸡啄米讲了CFile文件操作类,本节主要来说说MFC异常处理。
在鸡啄米C++编程入门系列的最后一节鸡啄米:C++编程入门系列之五十(异常处理)中,鸡啄米讲了C++标准异常的处理机制,如果你还没有学过这方面内容,可以到那节教程中去学习下。
MFC异常处理与C++标准异常处理是类似的,只是它在抛出和捕获异常时使用了一些宏,另外还将异常封装到了CException类及其派生类中。下面就分别讲解这些宏与异常类。
MFC异常宏
MFC提供的异常处理宏包括TRY、CATCH、AND_CATCH、END_CATCH、THROW、THROW_LAST等,大家看着名称是不是与C++标准异常处理的关键字相似?它们实际上就是在try、catch和throw的基础上定义的。鸡啄米下面贴出MFC中这些宏的定义:
- /////////////////////////////////////////////////////////////////////////////
- // Exception macros using try, catch and throw
- // (for backward compatibility to previous versions of MFC)
- #define TRY { AFX_EXCEPTION_LINK _afxExceptionLink; try {
- #define CATCH(class, e) } catch (class* e) \
- { ASSERT(e->IsKindOf(RUNTIME_CLASS(class))); \
- _afxExceptionLink.m_pException = e;
- #define AND_CATCH(class, e) } catch (class* e) \
- { ASSERT(e->IsKindOf(RUNTIME_CLASS(class))); \
- _afxExceptionLink.m_pException = e;
- #define END_CATCH } }
- #define THROW(e) throw e
- #define THROW_LAST() (AfxThrowLastCleanup(), throw)
- // Advanced macros for smaller code
- #define CATCH_ALL(e) } catch (CException* e) \
- { { ASSERT(e->IsKindOf(RUNTIME_CLASS(CException))); \
- _afxExceptionLink.m_pException = e;
- #define AND_CATCH_ALL(e) } catch (CException* e) \
- { { ASSERT(e->IsKindOf(RUNTIME_CLASS(CException))); \
- _afxExceptionLink.m_pException = e;
- #define END_CATCH_ALL } } }
- #define END_TRY } catch (CException* e) \
- { ASSERT(e->IsKindOf(RUNTIME_CLASS(CException))); \
- _afxExceptionLink.m_pException = e; } }
可以看出这些宏的定义中都包含了相应的C++异常处理关键字,本质上还是要通过try、catch和throw实现。

MFC异常类
MFC将对异常的处理封装到了异常类--CException类及其子类中。其实即使我们不使用MFC异常宏而是使用C++标准异常处理的话,也是会用到MFC的CException类及其子类的。MFC异常类及其含义如下表:
| MFC异常类 | 含义 |
| CSimpleException | 资源紧张异常的基类 |
| CInvalidArgException | 无效参数异常 |
| CMemoryException | 内存不足 |
| CNotSupportedException | 响应对不支持服务的请求 |
| CArchiveException | 存档/序列化异常 |
| CFileException | 文件异常 |
| CResourceException | Windows 资源分配异常 |
| COleException | OLE 异常 |
| CDBException | 数据库异常(ODBC 类) |
| COleDispatchException | 调度(自动化)异常 |
| CUserException | 用消息框警告用户然后引发一般 CException 的异常 |
| CDaoException | 数据库异常(DAO 类) |
| CInternetException | 网络异常 |
MFC异常处理
MFC异常处理的TRY块的形式如下:
TRY
{
复合语句
}
CATCH (MFC异常类名, 变量名)
{
复合语句
}
AND_CATCH (MFC异常类名, 变量名)
{
复合语句
}
AND_CATCH (MFC异常类名, 变量名)
{
复合语句
}
......
END_CATCH
说明:TRY后的一对大括号内包含了可能会抛出异常的代码块;用CATCH子句捕获并处理异常,它捕获的是指向异常对象的指针,小括号中的“MFC异常类名”就是CException类或其子类的名称,变量名代表的就是“MFC异常类名”类型的指针变量;如果抛出的异常类型与CATCH子句中的不一致,则对后面的所有AND_CATCH子句依次检查,若子句的异常类型与抛出异常类型一致则由其捕获并处理此异常;最后用END_CATCH结束整个TRY块。
注意:MFC异常宏只能捕获处理CException及其子类类型的异常。
我们在使用MFC类时,有些会自动抛异常,当然我们可以在需要的情况下使用AfxThrow******()自己抛异常,这里的******与上面MFC异常类列表中的各个异常类对应,例如抛文件异常可以使用AfxThrowFileException(),参数可以查阅MSDN。
MFC异常处理实例
鸡啄米给大家一个简单的MFC异常处理的代码段,了解下如何使用MFC异常处理即可。
- TRY
- {
- CFile file(_T("C:\\1.txt"), CFile::modeRead); // 构造CFile对象file,并以只读模式打开一个文件,如果不存在则抛出CFileException异常
- }
- CATCH (CFileException, e)
- {
- if (e->m_cause == CFileException::fileNotFound)
- {
- // 如果捕获到CFileException异常且为文件未找到时,弹出提示对话框
- MessageBox(_T("file not found!"));
- return;
- }
- }
- END_CATCH
上面这段代码的意义很简单,就是打开一个文件C:\1.txt,如果此文件不存在,则抛出CFileException异常,由CATCH子句捕获后判断是否是文件未找到,如果是则弹出提示对话框并返回。
再将上面的代码稍微修改下,以演示AfxThrow******()抛异常的用法:
- TRY
- {
- AfxThrowFileException(CFileException::fileNotFound); // 手动抛出CFileException异常
- }
- CATCH (CFileException, e)
- {
- if (e->m_cause == CFileException::fileNotFound)
- {
- // 如果捕获到CFileException异常且为文件未找到时,弹出提示对话框
- MessageBox(_T("file not found!"));
- return TRUE;
- }
- }
- END_CATCH
上面这段代码执行时,在CATCH子句中会捕获到文件异常。
最后提醒大家一下,MFC的建议是不再使用MFC异常宏,而是直接使用C++标准异常,它更加灵活。鸡啄米谢谢您对本站的持续关注,希望常回来看看。
转自:http://www.jizhuomi.com/software/181.html
VS2010/MFC编程入门之四十六(MFC常用类:MFC异常处理)的更多相关文章
- VS2010/MFC编程入门之三十六(工具栏:工具栏资源及CToolBar类)
上一节中鸡啄米讲了菜单及CMenu类的使用,这一节讲与菜单有密切联系的工具栏. 工具栏简介 工具栏一般位于主框架窗口的上部,菜单栏的下方,由一些带图片的按钮组成.当用户用鼠标单击工具栏上某个按钮时,程 ...
- VS2010/MFC编程入门之四十四(MFC常用类:定时器Timer)
前面一节鸡啄米讲了CTime类和CTimeSpan类的使用,本节继续讲与时间有关的定时器.定时器并不是一个类,主要考虑到,提起时间的话就不能不说定时器,所以就把它放到CTime和CTimeSpan之后 ...
- VS2010/MFC编程入门之四十四:定时器Timer
前面一节鸡啄米讲了CTime类和CTimeSpan类的使用,本节继续讲与时间有关的定时器.定时器并不是一个类,主要考虑到,提起时间的话就不能不说定时器,所以就把它放到CTime和CTimeSpan之后 ...
- VS2010/MFC编程入门之四十五(MFC常用类:CFile文件操作类)
上一节中鸡啄米讲了定时器Timer的用法,本节介绍下文件操作类CFile类的使用. CFile类概述 如果你学过C语言,应该知道文件操作使用的是文件指针,通过文件指针实现对它指向的文件的各种操作.这些 ...
- VS2010/MFC编程入门之十六(对话框:消息对话框)
前面几节鸡啄米讲了属性页对话框,我们可以根据所讲内容方便的建立自己的属性页对话框.本节讲解Windows系统中最常用最简单的一类对话框--消息对话框. 我们在使用Windows系统的过程中经常会见到消 ...
- VS2010/MFC编程入门之四十二(MFC常用类:CString类)
上一节鸡啄米讲了分割窗口的有关知识,本节开始讲解MFC的一些常用类,先来说说CString类. CString类简介 CString类作为MFC的常用类,当之无愧.可以这样说,只要是从事MFC开发,基 ...
- VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数)
上一节中鸡啄米讲了文本输出的知识,本节的主要内容是CDC类及其屏幕绘图函数. CDC类简介 CDC类是一个设备上下文类. CDC类提供了用来处理显示器或打印机等设备上下文的成员函数,还有处理与窗口客户 ...
- 工作总结:VS2010/MFC编程入门之十六(对话框:消息对话框)
原文地址:http://www.jizhuomi.com/software/171.html 我们在使用Windows系统的过程中经常会见到消息对话框,提示我们有异常发生或提出询问等.因为在软件开发中 ...
- VS2010/MFC编程入门之四十八(字体和文本输出:文本输出)
鸡啄米在上一节中讲了CFont字体类,本节主要讲解文本输出的方法和实例. 文本输出过程 在文本输出到设备以前,我们需要确定字体.字体颜色和输出的文本内容等信息.Windows窗口的客户区由应用程序管理 ...
随机推荐
- ELK系列一:ELK的安装
一.Elasticsearch.Kibana.Logstash.Elasticsearch-head的安装 ELK的安装 安装下载地址: https://www.elastic.co/cn/downl ...
- IIS7配置伪静态把后缀名映射为html方案
1.在IIS新建站点.[创建的时候不用去选择版本和模式,默认即可] 2.选中站点,切换到功能试图,找到“处理程序映射",双击之后,在打开窗口右侧的操作栏目下做如下设置: 1)右边" ...
- 简单ORM工具的设计和编写,自己项目中曾经用过的
http://www.cnblogs.com/szp1118/archive/2011/03/30/ORM.html 在之前的一个项目中自己编写了一个简单的ORM小工具,这次重新整理和重构了一下代码, ...
- windows网卡共享网络时,报Internet连接共享访问被启用时,出现了一个错误。(null)
今天笔者在自己电脑上作试验时,准备将无线网络连接共享给VMnet1时报Internet连接共享访问被启用时,出现了一个错误.(null)错误: 经上网查询到问题原因:没有启用 Windows Fire ...
- eclipse打断点只进入class文件中的解决办法
内容来源 https://www.cnblogs.com/scode2/p/8671908.html#undefined 是由于对应的Java类跟编译后的class文件,没有关联上, 解决办法: 在打 ...
- intellij idea移动至方法块function()末尾的快捷键
intellij idea移动至方法块末尾的快捷键: 1. move caret to code block end ctrl+] 2. move caret to code block end wi ...
- php---截取描述方法
参考: https://www.cnblogs.com/xsphehe/p/5682004.html 示例: /** * 参数说明 * $string 欲截取的字符串 * $sublen 截取的长度 ...
- Centos6.5 虚拟机Mongodb创建副本集
简单副本集的搭建 官方demo的最小化的副本集为Three Member Sets,一个primary和两个secondary.我们先就搭建一个这样的测试环境. 首先建立三个数据目录和日志目录: cd ...
- mongodb的学习笔记一(集合和文档的增删改查)
1数据库的增删改查 一.增加一个数据库: use blog-----切换到指定的数据库,如果数据库不存在,则自动创建该数据库(新建的数据库,如果没有存储对应的集合,是不会显示出来的) 二.删除一个数据 ...
- TOP100summit:【分享实录】爆炸式增长的斗鱼架构平台的演进
本篇文章内容来自2016年TOP100summit斗鱼数据平台部总监吴瑞城的案例分享. 编辑:Cynthia 吴瑞诚:斗鱼数据平台部总监 曾先后就职于淘宝.一号店. 从0到1搭建公司大数据平台.平台规 ...