100165387.htm

来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 95 行 · 第 1/2 页

HTM
95
字号
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体">与</span><span lang="EN-US" style="COLOR: black">.NET</span><span style="COLOR: black; FONT-FAMILY: 宋体">出现以前的语言一样,在</span><span lang="EN-US" style="COLOR: black">C#</span><span style="COLOR: black; FONT-FAMILY: 宋体">中,调试所涉及的主要技术是设置断点,使用它们在代码的执行过程中检查某处发生的情况。</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">1. </span><span style="FONT-FAMILY: 黑体">断点</span></h4>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在</span><span lang="EN-US">Visual Studio .NET</span><span style="FONT-FAMILY: 宋体">中,可以在执行的代码中给任意一行设置断点。最简单的方式是在代码编辑器中单击该行,即在文档窗口左边的阴影区域中单击该行</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">或者选择该行,按下</span><span lang="EN-US">F9</span><span style="FONT-FAMILY: 宋体">键</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">,这样,就在该行设置了一个断点,只要代码执行到该行,就会中断,把控制权交给调试程序。在</span><span lang="EN-US">Visual Studio</span><span style="FONT-FAMILY: 宋体">的以前版本中,断点在代码编辑器中用该行左边的一个大圆表示。</span><span lang="EN-US">Visual Studio .NET</span><span style="FONT-FAMILY: 宋体">则把该该行的文本和背景用另一种颜色来突出显示。再次单击该圆,就会删除断点。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">如果程序并不适合于每次执行一行就中断一次,也可以设置条件断点。为此,可以单击</span><span lang="EN-US">Debug | Windows | Breakpoints</span><span style="FONT-FAMILY: 宋体">菜单项,弹出一个对话框,该对话框要求用户给出要设置的断点信息,可以使用的选项有:</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体">指定只有在对设置了断点的代码执行一定次数后,才能中断程序的执行。</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体">指定执行某行一定的次数后,断点才起作用,例如执行该行</span><span lang="EN-US">20</span><span style="FONT-FAMILY: 宋体">次后,断点才起作用</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">可用于调试大循环</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体">给相关变量设置断点,而不是给指令设置断点。此时,监视的是变量值,只要变量的值发生了改变,就会触发断点。但是,使用这个选项会显著减慢代码的运行速度。在指令执行完后检查变量是否改变,会大大增加处理器时间。</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">2. </span><span style="FONT-FAMILY: 黑体">监视点</span></h4>
<p class="MsoNormal" style="LINE-HEIGHT: 15pt"><span style="FONT-FAMILY: 宋体">遇到断点时,通常要查看变量的值。最简单的方式是在代码编辑器中,把鼠标指针放在该变量名上,此时会显示一个小方框,其中给出了该变量的值。也可以使用监视窗口来查看变量的内容,它是一个带有标签的窗口,程序只有在调试程序中运行时,该对话框才会出现,如图</span><span lang="EN-US">12-23</span><span style="FONT-FAMILY: 宋体">所示。</span></p>
<p align="center"><span lang="EN-US"><img height="118" src="12/image023.jpg" width="362" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">&nbsp; 12-23</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">类变量或结构变量的旁边有一个</span><span lang="EN-US">+</span><span style="FONT-FAMILY: 宋体">图标,单击它可以展开变量,查看其字段的值。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">这个窗口的</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体">个选项卡主要用于监视不同的变量:</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">Autos </span><span style="FONT-FAMILY: 宋体">监视程序运行时最后访问的变量。</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">Locals </span><span style="FONT-FAMILY: 宋体">监视当前执行的方法中的变量。</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">Watch </span><span style="FONT-FAMILY: 宋体">监视用户在</span><span lang="EN-US">Watch</span><span style="FONT-FAMILY: 宋体">窗口中键入的变量。</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">3. </span><span style="FONT-FAMILY: 黑体">异常</span></h4>
<p class="MsoNormal" style="LINE-HEIGHT: 15pt"><span style="FONT-FAMILY: 宋体">应用程序中的异常可以确保在该程序中以合适的方式处理错误情况。它们可以保证应用程序正常运行,不会给用户显示许多技术性的对话框。但在调试时,异常并没有那么强大的功能,这个问题有两个方面:</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体">如果产生一个异常,则在调试时常常不希望由程序自动处理<span style="LETTER-SPACING: -1pt">&mdash;&mdash;</span></span><span style="LETTER-SPACING: -1pt"> </span><span style="FONT-FAMILY: 宋体">有时处理异常就意味着退出,中断程序的执行!我们要让调试程序查找到发生异常的原因。当然,问题是如果要编写出健全的、可以防范错误的好代码,程序就应能处理几乎所有的异常<span style="LETTER-SPACING: -1pt">&mdash;&mdash;</span></span><span style="LETTER-SPACING: -1pt"> </span><span style="FONT-FAMILY: 宋体">包括要检测的错误!</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体">如果产生了一个没有编写处理程序的异常,</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 0.1pt">运行库还是会查找该异常的处理程序。</span><span style="FONT-FAMILY: 宋体">此时它发现没有这样的处理程序,因而中断程序。这里没有调用堆栈,不能查看变量的值,因为它们都已出了作用域。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 15pt"><span style="FONT-FAMILY: 宋体">当然,可以在</span><span lang="EN-US">catch</span><span style="FONT-FAMILY: 宋体">块中设置断点,但这常常没有什么帮助,因为在执行</span><span lang="EN-US">catch</span><span style="FONT-FAMILY: 宋体">块时,按照定义,程序流会退出相应的</span><span lang="EN-US">try</span><span style="FONT-FAMILY: 宋体">块,这样,要查看的变量值就出了作用域,找不出错误发生的原因。甚至不能查看堆栈跟踪,找出</span><span lang="EN-US">throw</span><span style="FONT-FAMILY: 宋体">语句退出程序时执行了哪个方法,因为控制权仍在该方法中。当然在</span><span lang="EN-US">throw</span><span style="FONT-FAMILY: 宋体">语句上设置断点,可以解决这个问题,但如果代码中有许多</span><span lang="EN-US">throw</span><span style="FONT-FAMILY: 宋体">语句时,该如何编码?如何告诉编译器是哪个</span><span lang="EN-US">throw</span><span style="FONT-FAMILY: 宋体">语句抛出了异常?</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">实际上,</span><span lang="EN-US">Visual Studio</span><span style="FONT-FAMILY: 宋体">给这些问题提供了一个非常好的解决方案。查看一下</span><span lang="EN-US">Debug</span><span style="FONT-FAMILY: 宋体">主菜单,其中有一个</span><span lang="EN-US">Exceptions</span><span style="FONT-FAMILY: 宋体">菜单项,选择它会弹出</span><span lang="EN-US">Exceptions</span><span style="FONT-FAMILY: 宋体">对话框,如图</span><span lang="EN-US">12-24</span><span style="FONT-FAMILY: 宋体">所示,指定抛出异常时要执行什么操作。可以选择继续执行或者自动停止,开始调试代码,此时程序停止执行,调试程序开始调试</span><span lang="EN-US">throw</span><span style="FONT-FAMILY: 宋体">语句。</span></p>
<p align="center"><span lang="EN-US"><img height="288" src="12/image024.jpg" width="275" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US">&nbsp; 12-24</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">这个工具的强大之处是用户可以根据抛出了哪个类的异常,来定制程序的行为。例如,在上面的屏幕图上,告诉</span><span lang="EN-US">Visual Studio .NET</span><span style="FONT-FAMILY: 宋体">在遇到由任一个</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">基类抛出的异<span style="LETTER-SPACING: 0.1pt">常</span><span style="LETTER-SPACING: -0.3pt">时,就中断执行,开始调试程序,但如果抛出了</span></span><span lang="EN-US" style="LETTER-SPACING: 0.1pt">AppDomainUnloadedException</span><span style="FONT-FAMILY: 宋体">异常,则不中断执行。</span></p>
<p class="MsoNormal"><span lang="EN-US">Visual Studio .NET</span><span style="FONT-FAMILY: 宋体">知道</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">基类中所有的异常类,也知道在</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">环境外部抛出的许多异常。</span><span lang="EN-US">Visual Studio .NET</span><span style="FONT-FAMILY: 宋体">不会自动响应用户编写的定制异常类,但用户可以把自己的异常类手工添加到该列表中,指定哪个异常会立即停止执行程序。为此,只需单击图</span><span lang="EN-US">12-24</span><span style="FONT-FAMILY: 宋体">中的</span><span lang="EN-US">Add</span><span style="FONT-FAMILY: 宋体">按钮</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">在从树形结构中选择了一个顶级节点,该按钮就成为可用的</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">,键入异常类的名称即可。</span></p></div>
                <!-- page -->
                <div class="page" style="text-align: center">
                    <a href="100165386.htm">上一页</a>&nbsp;&nbsp;&nbsp;<a href="index.html">首页</a>&nbsp;&nbsp;&nbsp;<a href="100165388.htm">下一页</a>
                </div>
              
                <div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
                    <div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
                        图书导读
                    </div>
                    <div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
                        <!--导读-->
                        <h1 id="divCurrentNode2" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165387.htm'><font color='red'>12.1.7  调试</font></a></h1>
                        <div id="divRealteNod2" style="padding-left: 2px">
                        <div style='float:left;width:49%'>·<a href='100165384.htm'>12.1.4  读取Visual Studio 6项目</a></div><div style='float:right;width:49%'>·<a href='100165385.htm'>12.1.5  项目的浏览和编码</a></div><div style='float:left;width:49%'>·<a href='100165386.htm'>12.1.6  生成项目</a></div><div style='float:right;width:49%'>·<a href='100165388.htm'>12.2  其他.NET工具</a></div><div style='float:left;width:49%'>·<a href='100165389.htm'>12.2.1  ASP.NET Web Matrix Project</a></div><div style='float:right;width:49%'>·<a href='100165390.htm'>12.2.2  WinCV</a></div></div>
                    </div>
                </div>
                </div></div>
   
</body>
</html>

⌨️ 快捷键说明

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