⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap11.html

📁 利用软件开发
💻 HTML
📖 第 1 页 / 共 3 页
字号:
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb_2312-80">
<META NAME="Generator" CONTENT="Microsoft Word 97">
<TITLE>第三章 异常处理和诊断</TITLE>
</HEAD>
<BODY>

<FONT FACE="黑体" LANG="ZH-CN" SIZE=5><P ALIGN="CENTER"><A NAME="_Toc425698921">第十一章</FONT><FONT FACE="Arial" SIZE=5> </FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=5>异常处理和诊断</A></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">编写程序时出一些错误是难免的,在</FONT><FONT SIZE=3>C++</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中称在软件或硬件中发生的不期望或不需要的事件为异常(</FONT><FONT SIZE=3>Exception</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>)。</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>提供了两种异常处理机制:</P>

<UL>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY"><LI>C++</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>异常,在</FONT><FONT SIZE=3>MFC 3.0</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和更高版本中可以使用</LI></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY"><LI>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>异常,在</FONT><FONT SIZE=3>MFC 1.0</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和更高版本中可以使用</LI></P></UL>

<P ALIGN="JUSTIFY">在程序出错误后需要调试程序,</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>提供了许多诊断服务,可以让用户轻松的调试程序,这些诊断服务大多以特定宏和全局函数形式出现。</P>
<P ALIGN="JUSTIFY">本章将向读者介绍以下内容:</P>

<UL>
<P ALIGN="JUSTIFY"><LI>处理</FONT><FONT SIZE=3>C++</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>异常</LI></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY"><LI>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>异常</LI></P>
<P ALIGN="JUSTIFY"><LI>诊断服务</LI></P></UL>

</FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4><P ALIGN="CENTER"><A NAME="_Toc425698922">第一节</FONT><FONT SIZE=4> </FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4>处理</FONT><FONT SIZE=4>C++</FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4>异常</A></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">C++</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>使用</FONT><FONT SIZE=3>try</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>catch</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>throw</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>三个关键字来实现异常处理。使用</FONT><FONT SIZE=3>C++</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的异常处理能够使你的程序从异常状态中恢复。这些异常由处于正常控制流之外的代码来处理。</P>

<UL>
</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>注意:</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>新的</FONT><FONT SIZE=3>32</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>位的异常处理机制支持</FONT><FONT SIZE=3>C</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>C++</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>。但是,它并非为</FONT><FONT SIZE=3>C++</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>专门设计的。你应当保证你的代码非常适合于</FONT><FONT SIZE=3>C++</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>的异常处理,并且</FONT><FONT SIZE=3>C++</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>的异常处理是相当灵活的,它可以处理任何类型的异常。</LI></P></UL>

</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">异常处理机制允许程序对严重的和没有预料到的问题做出响应。一个异常块由下列三个部分组成:</P>

<UL>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY"><LI>try</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>块</LI></P></UL>

<P ALIGN="JUSTIFY">标志你认为可能会出现异常的代码。</P>

<UL>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY"><LI>catch</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>块</LI></P></UL>

<P ALIGN="JUSTIFY">紧跟着</FONT><FONT SIZE=3>try</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>块,里面包含了处理异常的代码。</P>

<UL>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY"><LI>throw</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>块</LI></P></UL>

<P ALIGN="JUSTIFY">抛出一个异常,激活</FONT><FONT SIZE=3>catch</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>块中的相应的异常处理代码。</P>
<P ALIGN="JUSTIFY">异常处理的机制比较简单,首先你将有可能出现问题的代码放在</FONT><FONT SIZE=3>try</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>块中,然后在</FONT><FONT SIZE=3>catch</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>块中放进用来处理异常的代码。如果在</FONT><FONT SIZE=3>try</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>块中的代码抛出一个异常,</FONT><FONT SIZE=3>try</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>块迅速退出执行,程序将转入</FONT><FONT SIZE=3>catch</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>块中执行相应的异常处理代码。</P>
</FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4><P ALIGN="CENTER"><A NAME="_Toc425698923">第二节</FONT><FONT SIZE=4> MFC</FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4>异常</A></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">在</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中</FONT><FONT SIZE=3>CException</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类是所有异常类的基类,它是一个抽象类,你不能使用它的对象,只能创建它的派生类的对象。它有两个公用方法:</FONT><FONT SIZE=3>GetErrorMessage</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>()和</FONT><FONT SIZE=3>ReportError</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>(),分别用于查找描述异常的信息和为用户显示一个错误信息的信息对话框。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">CException</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类包含以下基类(如图</FONT><FONT SIZE=3>11.1</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示),并提供了</FONT><FONT SIZE=3>THROW</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>THROW_LAST</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>TRY</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>CATC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3> AND_CATCH</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3> END_CATCH</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>这些宏用来处理异常。</P>
<P ALIGN="CENTER"><IMG SRC="Image443.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image443.gif" WIDTH=167 HEIGHT=292></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>11. 1 CException</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>的基类</P><DIR>

</FONT><FONT FACE="Arial" SIZE=3><P>(1)&#9;CArchiveException</P></DIR>

</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">一个</FONT><FONT SIZE=3>CArchiveException</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>用来描述序列化异常状态。它包含了一个数据成员</FONT><FONT SIZE=3>m_cause</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>用来表现异常的原因。它可能为以下值:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">none </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:没有错误发生</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">generic</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:未指定的错误</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">readOnly</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:试图写入一个为载入而打开的文档</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">endOfFile</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:当读取一个文档时到达文档尾部</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">writeOnly</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:试图读取一个为存储而打开的文档</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">badIndex</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:非法文件格式</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">badClass</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:试图读一个对象到一个错误类型对象中</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">badSchema</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:试图读一个对象,它带有不同的类的版本</P>
<P ALIGN="JUSTIFY">另外</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>还提供</FONT><FONT SIZE=3>AfxThrowArchiveException</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>()函数来抛出一个存档文件异常,形式如下:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>void AfxThrowArchiveException( int cause, LPCTSTR lpszArchiveName );</P><DIR>

</FONT><FONT FACE="Arial" SIZE=3><P>(2)&#9;CDaoException</P></DIR>

</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">一个</FONT><FONT SIZE=3>CDaoException</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类对象用来表示基于数据访问对象(</FONT><FONT SIZE=3>DAO,data access objects</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>)的</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>数据库类的异常。这个异常类包含三个决定异常原因的成员变量,这三个成员变量是:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">m_scode:</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>描述与异常相关的</FONT><FONT SIZE=3>SCODE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>代码</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">m_pErrorInfo</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:包含用于所有</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的</FONT><FONT SIZE=3>DAO</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类的所有异常的扩展错误代码</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">m_nAfxDaoError</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:包含</FONT><FONT SIZE=3>DAO</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>错误对象的指向</FONT><FONT SIZE=3>CDaoErrorInfo</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>结构的指针</P>
<P ALIGN="JUSTIFY">这个类有下列两个操作:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">GetErrorCount</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>()</FONT><FONT SIZE=3> </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>获取在数据库引擎异常集合中的异常数目</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">GetErrorInfo</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>()</FONT><FONT SIZE=3> </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>获取在异常集合中相似对象的错误信息</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中的</FONT><FONT SIZE=3>AfxThrowDaoException()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数抛出一个</FONT><FONT SIZE=3>CDaoException</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类型的异常,使用如下形式:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>void AFXAPI AfxThrowDaoException( int nAfxDaoError = NO_AFX_DAO_ERROR, SCODE scode = S_OK );</P><DIR>

</FONT><FONT FACE="Arial" SIZE=3><P>(3)&#9;CDBException</P></DIR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -