VS2010-MFC(MFC常用类:MFC异常处理)

转自:http://www.jizhuomi.com/software/236.html

上一节讲了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++代码

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

C++代码

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******()抛异常的用法:

C++代码

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++标准异常,它更加灵活。

原文地址:https://www.cnblogs.com/Tang-tangt/p/9477906.html

时间: 2024-10-14 16:43:27

VS2010-MFC(MFC常用类:MFC异常处理)的相关文章

VS2010-MFC(MFC常用类:CString类)

转自:http://www.jizhuomi.com/software/228.html CString类简介 CString类作为MFC的常用类,当之无愧.可以这样说,只要是从事MFC开发,基本都会遇到使用CString类的场合.因为字符串的使用比较普遍,而CString类又提供了对字符串的便捷操作,所以它给MFC开发人员带来了高的开发效率,受到了开发者的欢迎. 大家使用VS2010的话,可能会见到CStringT,实际上它是一个操作可变长度字符串的模板类.CStringT模板类有三个实例:C

高级列表控件ListCtrl关联的MFC中的类:CListCtrl

高级列表控件ListCtrl关联的MFC中的类:CListCtrl■ 报表样式ListCtrl常用操作:1.添加列标题头:InsertColumn2.获取与设置列宽:GetColumnWidth.SetColumnWidth3.添加一行:InsertItem.SetItemText4.获取与设置单元文本:GetItemText.SetItemText5.允许多行选中时,获取选中的行数:GetSelectedCount6.单行选中时,获取选中的行:GetSelectionMark7.选中某行:Se

VS2010中如何实现自定义MFC控件

本文简要讲解在VS2010中怎样实现自定义MFC控件的知识,以下是分步骤说明. 一.自定义一个空白控件  1.先创建一个MFC工程 NEW Project-->MFC-->MFC Application-->name:  "CustomCtr"-->Application Type选择"Dialog based".  2.在窗口中添加一个自定义控件 Toolbox-->"Custom Control"-->属性

MFC的socket类

MFC的socket类,部分封装了这些以WSA开头的socket函数,使用更加简单方便,只适合小型的网络通信编程的开发 1.CAsyncSocket类 -部分封装了WSA开头的socket函数,提供了socket通信更加简单的操作,是一个异步socket类 2.CSocket类 -继承自CAsyncSocket类,是一个同步socket类 3.使用MFC的socket类完成一个简单的文件传输的功能

MFC之AnimateWindows类

AnimateWindow 该函数能在显示与隐藏窗口时能产生特殊的效果.有两种类型的动画效果:滚动动画和滑动动画. 函数原型: BOOL AnimateWindow(HWND hWnd,DWORD dwTime,DWORD dwFlags): BOOL AnimateWindow(DWORD dwTime,DWORD dwFlags): 参数: hWnd:指定产生动画的窗口的句柄. dwTime:指明动画持续的时间(以微秒计),完成一个动画的标准时间为200微秒. dwFags:指定动画类型.这

MFC的基类

CWnd 提供窗口处理的一个类,里面有HWND m_hWnd成员 CDC 绘图类,所有和绘图有关的操作封装在这个类,CClientDC, CWindowDC皆派生自它,里面有m_nHdc成员 MFC的基类,布布扣,bubuko.com

MFC注册窗口类以及FindWindow按窗口类名查询(避免用#32770获取窗口句柄)

呵呵,最近在研究SendMessage函数,其中需要用到m_hWnd,之后延伸着又尝试获得窗口的句柄,于是遇到了FindWindow函数,原型如下: HWND FindWindow ( LPCSTR lpClassName,    //输入窗口的类名,其实需要是注册过的类名才行,否则是要报错或者查找失败的. LPCSTR lpWindowName, //输入窗口的名称,就是窗口上面蓝色的那行玩意儿写的字. ); 对于这个函数,如果按照窗口的名称查找,相信大家都非常简单,因为名称在rc文件里,是已

MFC DLL导出类

MFC DLL导出类 2011-06-15 10:54 2718人阅读 评论(0) 收藏 举报 dllmfcinterfaceparameterslibrarynull 方法1:   在VC上new一个名为dll的MFC DLL工程. 第一步,创建一个interface.h文件来定义接口,代码如下: //file interface.h #ifndef _INTERFACE_H_ #define _INTERFACE_H_ interface ITest { virtual int Print(

C++MFC编程笔记day06 MFC向导、MFC绘图类使用

MFC绘图 MFC绘图类包括绘图设备类和绘图对象类 1 绘图设备类 CDC类-父类是CObject,封装的是一般的绘图设备,例如:显示器, 打印机等. CWindowDC类-父类是CDC类,封装的是窗口对象,包括客户区和非 客户区. CClientDC类-父类是CDC类,封装的仍然是窗口,但是只包括客户区. CPaintDC类-父类是CDC类,封装的是窗口的客户区.但是,它只用 在窗口的WM_PAINT消息处理函数中. CMetaFileDC类-父类是CDC类,作用保存绘制命令. 2 使用 创建