友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
C语言实例教程(PDF格式)-第53部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
void AFXAPI AfxThrowDaoException( int nAfxDaoError = NO_AFX_DAO_ERROR; SCODE
scode = S_OK );
…………………………………………………………Page 631……………………………………………………………
(3) CDBException
一个CDBExceptio类的对象表示MFC数据库中的一种异常情况。这个类
包含两个用来决定异常原因的成员变量:
m_nRetCode:一个ODBC(Open Database Connectivity)返回的RETCODE
类型的代码
m_strError:包含一个描述错误信息的字符串
m_strStateNativeOrigin:包含描述带有ODBC错误代码的错误的字符
串
MFC中的AfxThrowDBException 函数抛出一个CDBException类型的
异常,使用如下形式:
void AfxThrowDBException( RETCODE nRetCode; CDatabase* pdb; HSTMT hstmt );
(3) CFileException
一个CFileException对象描述一个与文件相关的异常状态。这个类包
含三个描述异常原因的成员变量:
m_cause:包含与错误原因对应的代码。
m_lOsError:包含相关的操作系统错误数
m_strFileName:包含出现例外的文件名
成员变量m_cause可能为以下值:
none:没有错误发生
generic:未指定的错误
fileNotFound :文件不能定位错误
badPath :全部或部分路径无效
tooManyOpenFiles:达到允许打开的文件数 目
accessDenied :不能访问文件
invalidFile :试图访问一个无效的文件
…………………………………………………………Page 632……………………………………………………………
removeCurrentDir:删除正在操作中的目录
directoryFull:目录个数已满
badSeek :试图设置文件指针出错
hardIO :硬件出错
sharingViolation :共享出错
lockViolation :试图锁定已锁定的区域
diskFull :磁盘空间已满
endOfFile :到达文件结尾
MFC中的AfxThrowFileException 函数抛出一个CFileException类
型的异常,使用如下形式:
void AfxThrowFileException( int cause; LONG lOsError = –1; LPCTSTR lpszFileName
= NULL );
(4) CInternetException
一个CInternetException对象代表一个和Internet操作有关的异常状
态。它包含两个成员变量:
m_dwError:表示导致异常的错误
m_dwContext:和引起错误的操作有关的上下文变量
(5) CMemoryException
一个CMemoryException对象描述一个内存溢出异常。内存异常自动的
被new操作符抛出。
MFC中的AfxThrowMemoryException 函数抛出一个
CMemoryException类型的异常,使用如下形式:
void AfxThrowMemoryException( );
(6) CNotSupportedException
一个CNotSupportedException对象表示当不支持的特性被请求时发生
的异常,没有其它必要或可能的限制。
…………………………………………………………Page 633……………………………………………………………
MFC中的AfxThrowNotSupportedException 函数抛出一个
CNotSupportedException类型的异常,使用如下形式:
void AfxThrowNotSupportedException( );
(7) COleException
一个COleException对象表示和OLE操作有关的异常。它包含一个成员
变量m_sc来容纳异常原因的状态码。
MFC中的AfxThrowOleException 函数抛出一个COleException类型
的异常,使用如下形式:
void AFXAPI AfxThrowOleException( SCODE sc );
void AFXAPI AfxThrowOleException( HRESULT hr );
(8) COleDispatchException
一个COleDispatchException对象表现为OLE 自动化的关键部分所特有
的异常。它包含5个成员变量:
m_wCode: IDispatch特有的错误代码
m_strDescription:一个描述性错误
m_dwHelpContext:用于错误的Help上下文ID
m_strHelpFile:使用m_dwHelpContext的Help文件
m_strSource:产生异常的应用程序
MFC中的AfxThrowOleDispatchException 函数抛出一个
COleDispatchException类型的异常,使用如下形式:
void AFXAPI AfxThrowOleDispatchException( WORD wCode; LPCSTR lpszDescription;
UINT nHelpID = 0 );
void AFXAPI AfxThrowOleDispatchException( WORD wCode; UINT nDescriptionID;
UINT nHelpID = –1 );
(9) CResourceException
一个CResourceException对象表示当Windows不能定位或分配需要的
…………………………………………………………Page 634……………………………………………………………
资源时抛出的异常。
MFC中的AfxThrowOleDispatchException 函数抛出一个
CResourceException类型的异常,使用如下形式:
void AfxThrowResourceException( );
(10) CUserException
一个CUserException对象表示停止终端用户操作时抛出的异常。
MFC中的AfxThrowUserException 函数抛出一个CUserException类
型的异常,使用如下形式:
void AfxThrowUserException( );
第三节 诊断服务
上节讲述了使用异常处理来捕获程序中的错误,然而并非程序中所有
的错误都是可以捕获的,还会出现很多无法预知的错误,这些错误需
要在调试程序中发现并更正。MFC提供了许多诊断服务,供程序员调
试程序使用。
MFC提供的用于诊断程序的宏有:ASSERT、ASSERT_KINDOF、
ASSERT_VALID、DEBUG_NEW、TRACE、TRACE0、TRACE1、TRACE2、
TRACE3、VARIFY。本节将详细介绍ASSERT、VERIFY、TRACE 。
(1) ASSERT
这个宏的用法如下:
ASSERT( booleanExpression )
其中的参数booleanExpression是一个表达式或指针。
这个宏用来测试它的参数是否为真。如果参数不为真,这个宏就显示
一个诊断信息对话框,并终止程序的运行。如果参数为真,它不做任
何事情。诊断信息按照下面的形式显示:
Debug Assertion Failed!
Program:
File:
…………………………………………………………Page 635……………………………………………………………
Line:
其中Program Name是程序的的名称,File Names是出错的文件名,
num是出问题的诊断语句所在的行数。
诊断信息对话框如图11。2所示。
图11。 2 诊断输出信息
值得注意的是,ASSERT仅在MFC的调试 (Debug)版本中有效,在MFC
的发布 (Release)版本中,ASSERT语句不再有效,它不对参数进行
真假检测。
下面的代码中ASSERT作用是检查一个指向用户自定义的类CMyClass的
指针是否为空;代码如下:
CMyClass* m_pMyClass=new CMyClass;
ASSERT(m_pMyClass);
// 。。。。。。
(2) VERIFY
这个宏和ASSERT差不多,它的用法如下:
VERIFY( booleanExpression )
其中的参数booleanExpression是一个表达式或指针。
在MFC的调试版本中,VERIFY宏检测它的参数,如果参数不为真,弹
出如图1。2所示的诊断信息对话框。如果参数为真,它不做任何事
情。
在MFC的发布版本中,它仍对参数进行测试,但是当参数为假时,不
弹出诊断信息对话框。
下面这段代码可以让用户对ASSERT和VERIFFY两个宏之间的差别有更
…………………………………………………………Page 636……………………………………………………………
深入的了解,这段代码是在MFC的发布版本中编译的,之所以选择发
布版本是因为在这段代码中两个宏后面的参数都为假,使用发布版本
编译可以忽略这些错误。但是ASSERT不检测参数的真假,而VERIFY检
测参数的真假,所以只能弹出一个对话框。
在一个MFC的多文档应用程序Test中的OnDraw 函数中ToDo语句后
面添加下面的代码:
bool m_bValue=false;
ASSERT(m_bValue & ASSERTMessage());
VERIFY(m_bValue & VERIFYMessage());
为CTestView类添加两个成员函数ASSERTMessage()和VERIFYMessage
():
bool CTestView::ASSERTMessage()
{
MessageBox(〃经过ASSERT检验〃);
return true;
}
bool CTestView::VERIFYMessage()
{
MessageBox(〃经过VERIFY检验〃);
return true;
}
在MFC的发布版本中编译并运行该程序,弹出如图11。3所示的消息
框,显示 “经过VERIFY检验”,说明VERIFY检测了它的参数,而
ASSERT没有检测其参数。
图11。 3 VERIFY示例
(3) TRACE
…………………………………………………………Page 637……………………………………………………………
TRACE宏的用法如下:
TRACE( exp )
其中的参数exp定义了一组数量可变的参数。
TRACE是一个在程序运行时跟踪变量数值的便捷的方法,它的用法和
Printf完全相同。
l 注意:
l 使用TRACE一次最多可以显示512个字符,而且这个宏也只在MFC的
调试版本中有效。
下面的例子使用TRACE宏在程序运行时跟踪变量m_value的值。
代码如下:
int m_value=100;
for(int i=0;i
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!