第8章异常处理和诊断 内容摘要: 1.处理C艹+异常 2.MFC异常类捕获程序异常 3.MFC提供的用于诊断程序的宏调式程序
第8章 异常处理和诊断 内容摘要: 1. 处理C++异常 2. MFC异常类捕获程序异常 3. MFC提供的用于诊断程序的宏调式程序 返回目录
8.1 8.1处理C++异 学习目标 使用try、 catch、 throw三个关 字来实现异常处理
8.1 处理C++异 学习目标 使用try、catch、throw三个关 字来实现异常处理 。 8.1 返回第8章
8.1 1.try块:标志可能会出现异常的代码 2. catch块:紧跟着ty块,里面包含了处理异常 的代码。 3. throw块:抛出一个异常,激活 catch块中相 应的异常处理代码
1. try块:标志可能会出现异常的代码。 2. catch块:紧跟着try块,里面包含了处理异常 的代码。 3. throw块 :抛出一个异常,激活catch块中相 应的异常处理代码。 8.1
include 8.1 ass CExcept ublic CEXcept(int EXCode) m XCOde xcode nt GetCodeo return m Exco ate int m XCOde: oid maino
例题 #include 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块;如果在ty中扔出的是其他类型的数据, 则进入最后一个 catch块。 最后一个 catch块的声明是一个省略号(…),而不是具体数据类型,表示该 catch块可以接收前面ty块扔出的任何异常,但由于没有参数,不能访问扔出 异常提供的值。如果有多个 catch,则省略号 catch块应该放在最后
解释 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块应该放在最后
82MFC异常类 8.2 Exceptions CEx ception CArchiveException CDaoException CDBException CFileException CInternetException CMemoryException CNotSupportedException ColeException COleDi spatch Ex ception CResourceExce pti on LCUser Ex ception
8.2 MFC异常类 8.2 返回第8章
8.2 CFlle Exception 三个描述异常原因的成员变量 1. m cause:包含与错误原因对应的代码。 2. m lOs error:包含相关的操作系统错误数。 3. m strfileName:包含出现异常的文件名
CFileException 8.2 三个描述异常原因的成员变量 1. m_cause:包含与错误原因对应的代码。 2. m_lOsError:包含相关的操作系统错误数。 3. m_strFileName:包含出现异常的文件名
m cause可能为以下值 8.2 CFileException∷none 没有错误发生 CFileEXception generic 未指定的错误 CFileException: file Found:文件找不到错误。 CFileException: badPath 全部或部分路径无效 CFileException: tooManyOpenFiles:超出允许打开的文件数目 CFile Exception: accessDenied:不能访问文件 CFileException: invalidfile:试图访问一个无效的文件 CFileException: remove Current Dir:试图删除正在操作的目录。 CFileException: directory full!目录个数已满 CFileException hardI CFileException: badSeek 试图设置文件位置指针出错 硬件出错 CFileException: sharing Violation:共享出错 CFileException∷: lock violation:试图锁定已锁定的区域 CFileException: diskFull: 磁盘空间已满 CFileEXception; endOfFile 到达文件结尾
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 pFile Name: TRY CFile f( pFile Name, CFile: mode Create CFile: modeWrite CATCH( CFileEXception e if(e->m cause = CFile EXception fileNotFound printf(" ERROR: File not found\n") else if( e->m cause ==CFileEXception diskFull) printf("ERROR: Disk full\n") else if(e->m cause = CFile EXception: endofFile) printf( "ERROR: End Of FileIn) END CATCH
例子 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 使用 ASSERT宏 2.使用Ⅴ ERIFY宏 3.使用 TRACE宏
8.3 诊断服务 8.3 1. 使用ASSERT宏 2.使用VERIFY宏 3.使用TRACE宏 返回第8章