第 8章 异常处理和诊断
内容摘要,
1,处理 C++异常
2,MFC异常类捕获程序异常
3,MFC提供的用于诊断程序的宏调式程序
返回目录
8.1 处理 C++异
学习目标
使用 try,catch,throw三个关
字来实现异常处理 。
8.1
返回第 8章
1,try块:标志可能会出现异常的代码 。
2,catch块:紧跟着 try块, 里面包含了处理异常
的代码 。
3,throw块,抛出一个异常, 激活 catch块中相
应的异常处理代码 。
8.1
例题
#include <iostream.h>
class CExcept
{
public,
CExcept(int ExCode)
{
m_ExCode = ExCode;
}
int GetCode()
{
return m_ExCode;
}
private,
int m_ExCode;
};
void main()
{
8.1
解释 8.1
如果异常在关键字 try后面的代码块中扔出, 则控制立即传出这个块, 如果 try
块后面有适当的 catch块, 则控制传入 catch块处理异常 。
catch块前面有关键字 catch和括号中的声明 。 如果这个声明中指定的类型符合
产生异常的 throw语句给出的数值类型, 则控制传入关键字 catch后面的块 。 如
果类型不符, 则程序寻找另一个 catch块 。 catch块中的代码执行完毕后, 控制
传入块后面的第一个语句 。
在上面的程序中, 如果在 try中扔出的是字符串, 则进入第一个 catch块;如果
在 try中扔出的是整型数据, 则进入第二个 catch块;如果在 try中扔出的是
CExcept类型, 则进入第三个 catch块;如果在 try中扔出的是其他类型的数据,
则进入最后一个 catch块 。
最后一个 catch块的声明是一个省略号( … ),而不是具体数据类型,表示该
catch块可以接收前面 try块扔出的任何异常,但由于没有参数,不能访问扔出
异常提供的值。如果有多个 catch块,则省略号 catch块应该放在最后。
8.2 MFC异常类 8.2
返回第 8章
CFileException
8.2
三个描述异常原因的成员变量
1,m_cause:包含与错误原因对应的代码 。
2,m_lOsError:包含相关的操作系统错误数 。
3,m_strFileName:包含出现异常的文件名 。
8.2 m_cause可能为以下值
CFileException::none,没有错误发生 。
CFileException::generic,未指定的错误 。
CFileException::fileNotFound, 文件找不到错误 。
CFileException::badPath, 全部或部分路径无效 。
CFileException::tooManyOpenFiles:超出允许打开的文件数目 。
CFileException::accessDenied, 不能访问文件 。
CFileException::invalidFile, 试图访问一个无效的文件 。
CFileException::removeCurrentDir:试图删除正在操作的目录 。
CFileException::directoryFull,目录个数已满 。
CFileException::badSeek, 试图设置文件位置指针出错 。
CFileException::hardIO, 硬件出错 。
CFileException::sharingViolation, 共享出错 。
CFileException::lockViolation, 试图锁定已锁定的区域 。
CFileException::diskFull, 磁盘空间已满 。
CFileException::endOfFile, 到达文件结尾 。
例子 8.2
extern char* pFileName;
TRY
{
CFile f( pFileName,CFile::modeCreate | CFile::modeWrite );
}
CATCH( CFileException e )
{
if( e->m_cause == CFileException::fileNotFound )
printf( "ERROR,File not found\n");
else if( e->m_cause == CFileException:,diskFull)
printf( "ERROR,Disk full\n");
else if( e->m_cause == CFileException:,endOfFile)
printf( "ERROR,End Of File\n");
}
END_CATCH
8.3 诊断服务 8.3
1,使用 ASSERT宏
2,使用 VERIFY宏
3,使用 TRACE宏
返回第 8章
1,使用 ASSERT宏 8.3
这个宏的用法如下,
ASSERT( booleanExpression );
其中的参数 booleanExpression是一个表
达式或指针 。
如果参数不为真, 这个宏就显示一个诊
断信息对话框, 并终止程序的运行 。 如果参
数为真, 它不做任何事情 。 诊断信息按照下
面的形式显示,
使用 ASSERT宏 8.3
2,使用 VERIFY宏 8.3
这个宏的用法如下,
VERIFY( booleanExpression ) ;
其中的参数 booleanExpression是一个表
达式或指针 。
如果参数不为真, 这个宏就显示一个诊
断信息对话框, 并终止程序的运行 。 如果参
数为真, 它不做任何事情 。 诊断信息的显示
形式与 ASSERT 相同,
ASSERT和 VERIFFY两个宏之间的差别 8.3
ASSERT,
仅在 MFC的调试 ( Debug) 版本中有

VERIFFY,
在 MFC的发布版本中, 它仍对参数进
行测试, 但是当参数为假时, 不弹出诊
断信息对话框 。
3,使用 TRACE 宏 8.3
这个宏的用法如下,
TRACE( exp );
TRACE是一个在程序运行时跟踪变量
数值的便捷方法, 它的用法和 Printf完全
相同, 他的输出是 Debug窗口 。 如,
int m_value=100;
for(int i=0;i<5;i++)
{
m_value++;
TRACE("m_value = %d",m_value);
}
返回第 8章