📄 chap11.html
字号:
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中的</FONT><FONT SIZE=3>AfxThrowUserException</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>()函数抛出一个</FONT><FONT SIZE=3>CUserException</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类型的异常,使用如下形式:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>void AfxThrowUserException( );</P>
</FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4><P ALIGN="CENTER"><A NAME="_Toc425698924">第三节</FONT><FONT SIZE=4> </FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4>诊断服务</A></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">上节讲述了使用异常处理来捕获程序中的错误,然而并非程序中所有的错误都是可以捕获的,还会出现很多无法预知的错误,这些错误需要在调试程序中发现并更正。MFC提供了许多诊断服务,供程序员调试程序使用。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>提供的用于诊断程序的宏有:</FONT><FONT SIZE=3>ASSERT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>ASSERT_KINDOF</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>ASSERT_VALID</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>DEBUG_NEW</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>TRACE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>TRACE0</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>TRACE1</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>TRACE2</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>TRACE3</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>VARIFY</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。本节将详细介绍</FONT><FONT SIZE=3>ASSERT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>VERIFY</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>TRACE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P><DIR>
</FONT><FONT FACE="Arial" SIZE=3><P>(1)	ASSERT</P></DIR>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">这个宏的用法如下:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>ASSERT( booleanExpression )</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">其中的参数</FONT><FONT SIZE=3>booleanExpression</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>是一个表达式或指针。</P>
<P ALIGN="JUSTIFY">这个宏用来测试它的参数是否为真。如果参数不为真,这个宏就显示一个诊断信息对话框,并终止程序的运行。如果参数为真,它不做任何事情。诊断信息按照下面的形式显示</FONT><FONT SIZE=3>:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>Debug Assertion Failed!</P>
<P>Program:<Program Name></P>
<P>File:<File Name></P>
<P>Line:<num></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">其中</FONT><FONT SIZE=3>Program Name</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>是程序的的名称,</FONT><FONT SIZE=3>File Names</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>是出错的文件名,</FONT><FONT SIZE=3>num</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>是出问题的诊断语句所在的行数。</P>
<P ALIGN="JUSTIFY">诊断信息对话框如图</FONT><FONT SIZE=3>11.2</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示。</P>
<P ALIGN="CENTER"><IMG SRC="Image444.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image444.gif" WIDTH=275 HEIGHT=144></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>11. 2 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>诊断输出信息</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">值得注意的是,</FONT><FONT SIZE=3>ASSERT</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>Debug</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>Release</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>)版本中,</FONT><FONT SIZE=3>ASSERT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>语句不再有效,它不对参数进行真假检测。</P>
<P ALIGN="JUSTIFY">下面的代码中</FONT><FONT SIZE=3>ASSERT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>作用是检查一个指向用户自定义的类</FONT><FONT SIZE=3>CMyClass</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的指针是否为空</FONT><FONT SIZE=3>,</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>代码如下:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>CMyClass* m_pMyClass=new CMyClass;</P>
<P>ASSERT(m_pMyClass);</P>
<P>// ......</P><DIR>
</FONT><FONT FACE="Arial" SIZE=3><P>(2)	VERIFY</P></DIR>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">这个宏和</FONT><FONT SIZE=3>ASSERT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>差不多,它的用法如下:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>VERIFY( booleanExpression )</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">其中的参数</FONT><FONT SIZE=3>booleanExpression</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>VERIFY</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>宏检测它的参数,如果参数不为真,弹出如图</FONT><FONT SIZE=3>1.2</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>的发布版本中,它仍对参数进行测试,但是当参数为假时,不弹出诊断信息对话框。</P>
<P ALIGN="JUSTIFY">下面这段代码可以让用户对</FONT><FONT SIZE=3>ASSERT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>VERIFFY</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>ASSERT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>不检测参数的真假,而</FONT><FONT SIZE=3>VERIFY</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>Test</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中的</FONT><FONT SIZE=3>OnDraw</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>()函数中</FONT><FONT SIZE=3>ToDo</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>语句后面添加下面的代码:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>bool m_bValue=false;</P>
<P>ASSERT(m_bValue & ASSERTMessage());</P>
<P>VERIFY(m_bValue & VERIFYMessage());</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">为</FONT><FONT SIZE=3>CTestView</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类添加两个成员函数</FONT><FONT SIZE=3>ASSERTMessage()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>VERIFYMessage():</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>bool CTestView::ASSERTMessage()</P>
<P>{</P>
<P>	MessageBox("经过ASSERT检验");</P>
<P>	return true;</P>
<P>}</P>
<P>bool CTestView::VERIFYMessage()</P>
<P>{</P>
<P>	MessageBox("经过VERIFY检验");</P>
<P>	return true;</P>
<P>}</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>11.3</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示的消息框,显示“经过</FONT><FONT SIZE=3>VERIFY</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>检验”,说明</FONT><FONT SIZE=3>VERIFY</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>检测了它的参数,而</FONT><FONT SIZE=3>ASSERT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>没有检测其参数。</P>
<P ALIGN="CENTER"><IMG SRC="Image445.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image445.gif" WIDTH=73 HEIGHT=62></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>11. 3 VERIFY</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>示例</P><DIR>
</FONT><FONT FACE="Arial" SIZE=3><P>(3)	TRACE</P></DIR>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">TRACE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>宏的用法如下:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>TRACE( exp )</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">其中的参数</FONT><FONT SIZE=3>exp</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>定义了一组数量可变的参数。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">TRACE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>是一个在程序运行时跟踪变量数值的便捷的方法,它的用法和</FONT><FONT SIZE=3>Printf</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>TRACE</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>一次最多可以显示</FONT><FONT SIZE=3>512</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>个字符,而且这个宏也只在</FONT><FONT SIZE=3>MFC</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">下面的例子使用</FONT><FONT SIZE=3>TRACE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>宏在程序运行时跟踪变量</FONT><FONT SIZE=3>m_value</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的值。</P>
<P ALIGN="JUSTIFY">代码如下:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>int m_value=100;</P>
<P>for(int i=0;i<5;i++)</P>
<P>{</P>
<P>	m_value++;</P>
<P>	TRACE("m_value = %d",m_value);</P>
<P>}</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="CENTER"><IMG SRC="Image446.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image446.gif" WIDTH=347 HEIGHT=98></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>11. 4 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>查看</FONT><FONT SIZE=1>TRACE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>信息</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">以调试方式运行该应用程序的调试版本,即可从</FONT><FONT SIZE=3>Developer Studio</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的</FONT><FONT SIZE=3>Output</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>窗口在检查到</FONT><FONT SIZE=3>TRACE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>宏输出的诊断信息。</P></FONT></BODY>
</HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -