第 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.2m_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章