按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
wsprintf(s2;〃%ld〃;m_totalHours);
wsprintf(s3;〃%ld〃;m_totalMinutes);
wsprintf(s4;〃%ld〃;m_totalSeconds);
CString m_str=〃此时间范围包含:n完整天数 :〃+CString(s1)+
〃n完整小时数:〃+CString(s2)+〃n完整分数 :〃+CString(s3)+
〃n完整秒数 :〃+CString(s4);
MessageBox(m_str);
图10。 20 获取时间范围量包含的天、小时、分和秒数
这段代码主要让读者体会使用CTimeSpan处理时间范围量的便捷。运
行结果如图10。20所示,消息框中显示了希望获得的信息。
…………………………………………………………Page 628……………………………………………………………
第十一章 异常处理和诊断
编写程序时出一些错误是难免的,在C++中称在软件或硬件中发生的
不期望或不需要的事件为异常 (Exception)。MFC提供了两种异常处
理机制:
l C++异常,在MFC 3。0和更高版本中可以使用
l MFC异常,在MFC 1。0和更高版本中可以使用
在程序出错误后需要调试程序,MFC提供了许多诊断服务,可以让用
户轻松的调试程序,这些诊断服务大多以特定宏和全局函数形式出
现。
本章将向读者介绍以下内容:
l 处理C++异常
l MFC异常
l 诊断服务
第一节 处理C++异常
C++使用try、catch、throw三个关键字来实现异常处理。使用C++的
异常处理能够使你的程序从异常状态中恢复。这些异常由处于正常控
制流之外的代码来处理。
l 注意:
l 新的32位的异常处理机制支持C和C++。但是,它并非为C++专门设
计的。你应 当保证你的代码非常适合于C++的异常处理,并且C++
的异常处理是相当灵活的,它可以处理任何类型的异常。
异常处理机制允许程序对严重的和没有预料到的问题做出响应。一个
异常块由下列三个部分组成:
l try块
标志你认为可能会出现异常的代码。
l catch块
…………………………………………………………Page 629……………………………………………………………
紧跟着try块,里面包含了处理异常的代码。
l throw块
抛出一个异常,激活catch块中的相应的异常处理代码。
异常处理的机制比较简单,首先你将有可能出现问题的代码放在try
块中,然后在catch块中放进用来处理异常的代码。如果在try块中的
代码抛出一个异常,try块迅速退出执行,程序将转入catch块中执行
相应的异常处理代码。
第二节 MFC异常
在MFC中CException类是所有异常类的基类,它是一个抽象类,你不
能使用它的对象,只能创建它的派生类的对象。它有两个公用方法:
GetErrorMessage 和ReportError ,分别用于查找描述异常的
信息和为用户显示一个错误信息的信息对话框。
CException类包含以下基类 (如图11。1所示),并提供了THROW、
THROW_LAST、TRY、CATC、 AND_CATCH、 END_CATCH这些宏用来处理
异常。
图11。 1 CException的基类
(1) CArchiveException
一个CArchiveException用来描述序列化异常状态。它包含了一个数
据成员m_cause用来表现异常的原因。它可能为以下值:
…………………………………………………………Page 630……………………………………………………………
none :没有错误发生
generic:未指定的错误
readOnly:试图写入一个为载入而打开的文档
endOfFile:当读取一个文档时到达文档尾部
writeOnly:试图读取一个为存储而打开的文档
badIndex:非法文件格式
badClass:试图读一个对象到一个错误类型对象中
badSchema:试图读一个对象,它带有不同的类的版本
另外MFC还提供AfxThrowArchiveException 函数来抛出一个存档
文件异常,形式如下:
void AfxThrowArchiveException( int cause; LPCTSTR lpszArchiveName );
(2) CDaoException
一个CDaoException类对象用来表示基于数据访问对象 (DAO;data
access objects)的MFC数据库类的异常。这个异常类包含三个决定
异常原因的成员变量,这三个成员变量是:
m_scode:描述与异常相关的SCODE代码
m_pErrorInfo:包含用于所有MFC的DAO类的所有异常的扩展错误代码
m_nAfxDaoError:包含DAO错误对象的指向CDaoErrorInfo结构的指针
这个类有下列两个操作:
GetErrorCount 获取在数据库引擎异常集合中的异常数 目
GetErrorInfo 获取在异常集合中相似对象的错误信息
MFC中的AfxThrowDaoException()函数抛出一个CDaoException类型的
异常,使用如下形式:
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