&&&&&& 上一节中鸡啄米讲了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¯os&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¯os&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¬&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¬&found!")); &&
- &&&&&&&&return&true; &&
- &&&&} &&
- } &&
- end_catch&&
&&&&&&&上面这段代码执行时,在catch子句中会捕获到文件异常。
&&&&&& 最后提醒大家一下,mfc的建议是不再使用mfc异常宏,而是直接使用c++标准异常,它更加灵活。鸡啄米谢谢您对本站的持续关注,希望常回来看看。