c 2008程序设计基础案例教程 教学课件 江南 第五章 调试与异常处理

上传人:bin****86 文档编号:54724949 上传时间:2018-09-18 格式:PPT 页数:32 大小:1.10MB
返回 下载 相关 举报
c  2008程序设计基础案例教程 教学课件 江南 第五章 调试与异常处理_第1页
第1页 / 共32页
c  2008程序设计基础案例教程 教学课件 江南 第五章 调试与异常处理_第2页
第2页 / 共32页
c  2008程序设计基础案例教程 教学课件 江南 第五章 调试与异常处理_第3页
第3页 / 共32页
c  2008程序设计基础案例教程 教学课件 江南 第五章 调试与异常处理_第4页
第4页 / 共32页
c  2008程序设计基础案例教程 教学课件 江南 第五章 调试与异常处理_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《c 2008程序设计基础案例教程 教学课件 江南 第五章 调试与异常处理》由会员分享,可在线阅读,更多相关《c 2008程序设计基础案例教程 教学课件 江南 第五章 调试与异常处理(32页珍藏版)》请在金锄头文库上搜索。

1、在线教务辅导网:http:/,教材其余课件及动画素材请查阅在线教务辅导网,QQ:349134187 或者直接输入下面地址:,http:/,C#2008程序设计基础案例教程,第五章 调试与异常处理,5.1 程序调试,程序员在编码过程中经常犯一些错误,例如算术运算时不小心使计算结果超出结果变量数据类型的有效范围(这种情况称为溢出)。当程序运行时出现了溢出情况,而恰好又位做处理,那么程序将因出现错误而被关闭。但是程序中处理了那么多数据,程序员如何知道错误出现在哪里呢?这就需要使用Visual Studio2008的调试功能。,5.1.1 案例功能,在使用图书借阅管理系统的备忘录功能时,假设用户不小心

2、修改了Log.txt文件,在文件头增加了一个空行,则运行时出现如图所示的效果:,能否在执行temp = sr.ReadLine();语句时程序暂停来检测变量的值以确定问题所在?,5.1.2 案例步骤,设置断点为了能让程序在执行temp = sr.ReadLine();语句时程序能暂停,我们可以在这条语句上设置断点,设置中断有以下两种方法: 使光标停在语句所在行,然后按快捷键F9或者选择调试菜单的“切换断点”命令。 用鼠标单击该行的前边界,如图所示。,单击这里,5.1.2 案例步骤,启动调试单击工具栏上的“启动调试”按钮或按下F5启动调试,选择备忘录功能,程序运行到第一个断点处暂停,注意断点语句

3、此时还未执行。“调试”菜单提供了3个继续执行代码的命令: 逐语句 逐过程 跳出“逐语句”和“逐过程”的差异仅在于它们处理函数调用的方式不同。这两个命令都指示调试器执行下一行的代码。如果某一行包含函数调用,“逐语句”仅执行调用本身,然后在函数内的第一个代码行处停止。而“逐过程”执行整个函数,然后在函数外的第一行处停止。位于函数调用的内部并想返回到调用函数时,请使用“跳出”。“跳出”将一直执行代码,直到函数返回,然后在调用函数中的返回点处中断。,5.1.2 案例步骤,查看变量的值当程序中断时,将鼠标停在变量上1-2秒,将悬浮显示出变量的当前值,如下图所示:,5.1.3 案例拓展,若断点在循环内部,

4、则每循环一次都要中断一次,若循环次数庞大,将给调试带来不便。 可以考虑为断点设置条件,在断点上单击鼠标右键,弹出如图所示菜单:,断点设置,命中次数在菜单中选择“命中次数”命令,弹出“断点命中次数”窗口(见下图),在下拉框中选择“中断,条件是命中次数等于”,文本框中输入50,点击确定后,重新启动调试,发现循环内断点在循环到第50次时才中断,而不是每次都中断。,断点设置,断点其他设置 位置:可以设置断点在文件的具体位置。 条件:条件是一个表达式,它确定断点是命中还是跳过。当调试器到达该断点时,它会计算条件的值。只有当条件满足时,断点才会命中。可以在某个位置断点处设置条件,只有当条件为真时,才会中断

5、执行。 命中次数:它跟踪断点的命中次数。默认情况下,每次命中断点时断点都中断代码的执行。您可以更改此行为,以便仅当命中次数等于或超过指定值或者仅当命中次数为给定值的倍数时,断点才中断代码。 通过筛选器,可以将断点设置在指定的计算机、进程和线程上。在调试运行于多个处理器上的应用程序时,筛选器非常有用。,调试窗口,监视窗口 只有在中断状态下可以使用该窗口,利用调试工具栏可以打开该窗口。可以在窗口中监视变量或表达式,如图所示。在代码中选中变量或表达式并拖动到监视窗口(或右键选择“添加监视”命令)即可进行监视,也可以在监视窗口的空行中直接输入要监视的变量或表达式。当代码单步执行时,监视变量或表达式的值

6、若发生变化将以红色字体显示。,调试窗口,快速监视窗口中断时可以选中变量或表达式后右键选择“快速监视”来使用快速监视对话框进行监视,如下图所示:,调试窗口,即时窗口即时窗口用于调试和计算表达式、执行语句、输出变量值等。它使您得以在调试期间输入表达式,由开发语言对其进行计算或执行。若要显示“即时”窗口,请打开要编辑的项目,然后从“调试”菜单中选择“窗口”,再选择“即时”。,调试窗口,命令窗口“命令”窗口用于直接在 Visual Studio 集成开发环境 (IDE) 中执行命令或别名。可以执行菜单命令和不在任何菜单上显示的命令。若要显示“命令”窗口,请从“视图”菜单中选择“其他窗口”,再选择“命令

7、窗口”。,调试窗口,自动窗口“自动”窗口用于监视程序运行时最后访问的变量。,调试窗口,局部变量窗口“局部变量”窗口监视当前执行方法中的变量。与“自动”窗口相比,“局部变量”窗口列出了更多的变量。,5.1.4 案例思考,假设在文本Log.txt中的空行是在偶数行(例如第2行是空行),则按前面介绍的语句位置设置断点进行调试是否能检测出问题所在?有无更好的断点位置?如果有,考虑应如何设置断点属性尽快找出问题原因(假设第100行是空行)。,5.2 错误与异常处理,错误的出现并不总是编写应用程序的人的原因,有时应用程序会因为终端用户的操作而发生错误,例如删除只读文件,数据库不存在等。无论如何,我们都应预

8、测应用程序和代码中出现的错误。C#处理错误的机智为每种错误提供定制的处理,并把识别错误的代码与处理错误的代码分离开来,这种机制称为异常处理。,5.2.1 案例功能,在图书借阅管理系统中,需要频繁的访问数据库实现图书查询与借还以及读者的管理等。而数据库操作经常会由于数据库不存在、连接密码错误、执行的SQL语句错误等原因产生异常,最终导致应用程序终止。例如在打开读者管理窗口时,程序将从数据库中读取读者信息显示在窗口上。对应代码如下(在文件ReaderManager.cs内): private void ShowDt()/显示的过程 Dt.Clear();Conn.Open();Da.Fill(Dt

9、);Conn.Close();dataGridView1.DataSource = Dt; private void ReaderManger_Load(object sender, EventArgs e) /显示读者表ShowDt(); ,5.2.1 案例功能,假设用户修改了数据库,将读者表Readers中的ReaderId修改为Id,则运行时用户如果打开读者管理窗口,程序将弹出如图所示的对话框。,5.2.1 案例功能,此时程序将无法继续运行,非法终止。而如果使用了异常处理,则同样的问题将提示如图所示的信息,点击确定后用户可以继续执行应用程序的其他功能。,5.1.2 案例步骤,.NET F

10、ramework使用try-catch-finally异常处理机制处理和捕捉错误。为了捕获上节所出现的错误,在代码文件ReaderManager.cs中的ShowDt方法中添加try-catch-finally结构,修改后的代码如下: private void ShowDt()/显示的过程 tryDt.Clear();Conn.Open();Da.Fill(Dt);dataGridView1.DataSource = Dt;catch (System.Exception ex)MessageBox.Show(ex.Message.ToString();/弹出对话框显示异常信息finallyCo

11、nn.Close(); ,异常处理,程序的异常处理分为3种不同类型的代码块: try块包含的代码组成了程序的正常操作部分,但可能遇到某些严重的错误。 catch块包含的代码处理各种错误,这些错误是try块中的代码执行时遇到的。 finally块包含的代码清理资源或执行要在try块或catch块末尾执行的其他操作。无论是否产生异常,都会执行finally块。finally块是可选的。如果不需要清理代码,就不需要包含此块。,异常处理执行步骤,步骤如下: 程序流进入try块。 如果没有错误发生,就会正常执行操作。当程序流离开try块后,即使什么也没有发生,也会自动进入finally块(第5步)。但如

12、果在try块中程序检测到一个错误,程序流就会跳转到catch块(下一步)。 在catch块中处理错误。 在catch块执行完后,程序流会自动进入finally块。 执行finally块。,异常处理结构变种,可以省略finally块 可以提供任意多个catch块,处理不同类型的错误 可以省略catch块尽管catch和finally是可选的,但不能同时省略。可以使用throw语句发出在程序执行期间出现反常情况(异常)的信号,使用方法为:throw new 异常类();可以在catch块中使用无表达式的throw语句,在此情况下,该语句会再次引发当前正由 Catch 语句处理的异常。可以使用异常处

13、理结构处理throw抛出的异常。,5.1.3 案例拓展,.NET提供了许多预定义的异常类,如下图所示:,异常类,通常使用异常对象的Message属性获取异常信息,在System.Exception中还有许多其他属性,如下表:,捕获多个异常,一个try结构可能存在多个catch块,这是由于try块中的代码可能引发多种类型的异常,使用多个catch可以捕获各种异常。 例如:tryint index = Convert.ToInt32(Console.ReadLine();Console.WriteLine(aindex);catch (FormatException ex)Console.Writ

14、eLine(“应该输入数字:“ + ex.Message);catch (IndexOutOfRangeException ex)Console.WriteLine(“索引超出范围:“ + ex.Message);catch (Exception ex)Console.WriteLine(“其他异常发生:“ + ex.Message);,异常处理机制,与switch语句的执行方式类似,找到第一个匹配的异常并处理后将不再寻找匹配。 如果产生的异常未找到匹配,.NET运行库会捕获它。代码的执行会立即中断,并给用户显示一个对话框,说明代码没有处理异常,并给出.NET运行库能检索到的异常信息。 因此,

15、应捕获尽可能多的异常,并以合理的方式处理它们。,try的嵌套,异常的一个特性是try块可以嵌套,如下所示: try / Point Atry/ Point Bcatch/ Point Cfinally/ clean up / Point D catch / error handling finally / clean up ,try嵌套处理机制,在每个块中,.NET运行库顺序执行try块,查找合适的处理程序,在每个步骤中,当退出catch块后,就会执行对应finally块中的清理代码,但不执行finally块外部的代码。若内部产生的异常内部无法处理则抛出到外部的catch块处理,直到找到合适的catch处理程序,并执行为止。 注意:在catch和finally块中抛出异常是合理的。,5.2.4 案例思考,运行图书借阅管理系统,在借书窗口中,输入读者ID,点击“详细”按钮即可查看读者相关信息。尝试在文本框中进行各种输入,找出可能出现的异常。并修改代码捕捉这些错误进行异常处理,使程序能正常运行。 打开备忘录窗口,先备份日志文件。在应用程序目录的backup文件夹下,将备份文件Logbk.txt设置为只读,之后在备忘录窗口点击“删除备份”按钮,查看出现的异常。试修改有关代码处理该异常。,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号