&&&&&& 上一节中鸡啄米讲了cfile文件操作类,本节主要来说说mfc异常处理。

&&&&&& 在鸡啄米c++编程入门系列的最后一节鸡啄米:c++编程入门系列之五十(异常处理)中,鸡啄米讲了c++标准异常的处理机制,如果你还没有学过这方面内容,可以到那节教程中去学习下。

&&&&&& mfc异常处理与c++标准异常处理是类似的,只是它在抛出和捕获异常时使用了一些宏,另外还将异常封装到了cexception类及其派生类中。下面就分别讲解这些宏与异常类。

&&&&&&&mfc异常宏

&&&&&& mfc提供的异常处理宏包括try、catch、and_catch、end_catch、throw、throw_last等,大家看着名称是不是与c++标准异常处理的关键字相似?它们实际上就是在try、catch和throw的基础上定义的。鸡啄米下面贴出mfc中这些宏的定义:

c++代码
  1. ///////////////////////////////////////////////////////////////////////////// &&
  2. //&exception¯os&using&try,&catch&and&throw &&
  3. //&&(for&backward&compatibility&to&previous&versions&of&mfc) &&
  4. &&
  5. #define&try&{&afx_exception_link&_afxexceptionlink;&try&{ &&
  6. &&
  7. #define&catch(class,&e)&}&catch&(class*&e)&\ &&
  8. &&&&{&assert(e->iskindof(runtime_class(class)));&\ &&
  9. &&&&&&&&_afxexceptionlink.m_pexception&=&e; &&
  10. &&
  11. #define&and_catch(class,&e)&}&catch&(class*&e)&\ &&
  12. &&&&{&assert(e->iskindof(runtime_class(class)));&\ &&
  13. &&&&&&&&_afxexceptionlink.m_pexception&=&e; &&
  14. &&
  15. #define&end_catch&}&} &&
  16. &&
  17. #define&throw(e)&throw&e &&
  18. #define&throw_last()&(afxthrowlastcleanup(),&throw) &&
  19. &&
  20. //&advanced¯os&for&smaller&code &&
  21. #define&catch_all(e)&}&catch&(cexception*&e)&\ &&
  22. &&&&{&{&assert(e->iskindof(runtime_class(cexception)));&\ &&
  23. &&&&&&&&_afxexceptionlink.m_pexception&=&e; &&
  24. &&
  25. #define&and_catch_all(e)&}&catch&(cexception*&e)&\ &&
  26. &&&&{&{&assert(e->iskindof(runtime_class(cexception)));&\ &&
  27. &&&&&&&&_afxexceptionlink.m_pexception&=&e; &&
  28. &&
  29. #define&end_catch_all&}&}&} &&
  30. &&
  31. #define&end_try&}&catch&(cexception*&e)&\ &&
  32. &&&&{&assert(e->iskindof(runtime_class(cexception)));&\ &&
  33. &&&&&&&&_afxexceptionlink.m_pexception&=&e;&}&}&&

&&&&&& 可以看出这些宏的定义中都包含了相应的c++异常处理关键字,本质上还是要通过try、catch和throw实现。

mfc异常处理

&&&&&&&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异常处理即可。

c++代码
  1. try &&
  2. { &&
  3. &&&&cfile&file(_t("c:\\1.txt"),&cfile::moderead);&&&//&构造cfile对象file,并以只读模式打开一个文件,如果不存在则抛出cfileexception异常 &&
  4. } &&
  5. catch&(cfileexception,&e) &&
  6. { &&
  7. &&&&if&(e->m_cause&==&cfileexception::filenotfound) &&
  8. &&&&{ &&
  9. &&&&&&&&//&如果捕获到cfileexception异常且为文件未找到时,弹出提示对话框 &&
  10. &&&&&&&&messagebox(_t("file¬&found!")); &&
  11. &&&&&&&&return; &&
  12. &&&&} &&
  13. } &&
  14. end_catch&&

&&&&&&&上面这段代码的意义很简单,就是打开一个文件c:\1.txt,如果此文件不存在,则抛出cfileexception异常,由catch子句捕获后判断是否是文件未找到,如果是则弹出提示对话框并返回。

&&&&&& 再将上面的代码稍微修改下,以演示afxthrow******()抛异常的用法:

c++代码
  1. try &&
  2. { &&
  3. &&&&afxthrowfileexception(cfileexception::filenotfound);&&&//&手动抛出cfileexception异常 &&
  4. } &&
  5. catch&(cfileexception,&e) &&
  6. { &&
  7. &&&&if&(e->m_cause&==&cfileexception::filenotfound) &&
  8. &&&&{ &&
  9. &&&&&&&&//&如果捕获到cfileexception异常且为文件未找到时,弹出提示对话框 &&
  10. &&&&&&&&messagebox(_t("file¬&found!")); &&
  11. &&&&&&&&return&true; &&
  12. &&&&} &&
  13. } &&
  14. end_catch&&

&&&&&&&上面这段代码执行时,在catch子句中会捕获到文件异常。

&&&&&& 最后提醒大家一下,mfc的建议是不再使用mfc异常宏,而是直接使用c++标准异常,它更加灵活。鸡啄米谢谢您对本站的持续关注,希望常回来看看。

除非特别注明,鸡啄米文章均为原创
转载请标明本文地址:http://www.jizhuomi.com/software/236.html
2012-9-13 21:49:7
作者:鸡啄米 分类:软件开发 浏览: 评论:6