c  2008程序设计基础案例教程 江南 第五章 调试与异常处理1新_第1页
c  2008程序设计基础案例教程 江南 第五章 调试与异常处理1新_第2页
c  2008程序设计基础案例教程 江南 第五章 调试与异常处理1新_第3页
c  2008程序设计基础案例教程 江南 第五章 调试与异常处理1新_第4页
c  2008程序设计基础案例教程 江南 第五章 调试与异常处理1新_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C#2008程序设计基础案例教程第五章 调试与异常处理 2018/8/8 15.1 程序调试程序员在编码过程中经常犯一些错误,例如算术运算时不小心使计算结果超出结果变量数据类型的有效范围(这种情况称为溢出)。当程序运行时出现了溢出情况,而恰好又位做处理,那么程序将因出现错误而被关闭。但是程序中处理了那么多数据,程序员如何知道错误出现在哪里呢?这就需要使用 Visual Studio2008的调试功能。2018/8/8 25.1.1 案例功能o 在使用图书借阅管理系统的备忘录功能时,假设用户不小心修改了 Log.txt文件,在文件头增加了一个空行,则运行时出现如图所示的效果:能否在执行 temp = sr.ReadLine();语句时程序暂停来检测变量的值以确定问题所在?2018/8/8 35.1.2 案例步骤o 设置断点为了能让程序在执行 temp = sr.ReadLine();语句时程序能暂停,我们可以在这条语句上设置断点,设置中断有以下两种方法: 使光标停在语句所在行,然后按快捷键 F9或者选择调试菜单的 “切换断点 ”命令。 用鼠标单击该行的前边界,如图所示。单击这里2018/8/8 45.1.2 案例步骤o 启动调试单击工具栏上的 “启动调试 ”按钮或按下 F5启动调试,选择备忘录功能,程序运行到第一个断点处暂停,注意断点语句此时还未执行。 “调试 ”菜单提供了 3个继续执行代码的命令: 逐语句 逐过程 跳出“逐语句 ”和 “逐过程 ”的差异仅在于它们处理函数调用的方式不同。这两个命令都指示调试器执行下一行的代码。如果某一行包含函数调用, “逐语句 ”仅执行调用本身,然后在函数内的第一个代码行处停止。而 “逐过程 ”执行整个函数,然后在函数外的第一行处停止。位于函数调用的内部并想返回到调用函数时,请使用 “跳出 ”。 “跳出 ”将一直执行代码,直到函数返回,然后在调用函数中的返回点处中断。2018/8/8 55.1.2 案例步骤o 查看变量的值当程序中断时,将鼠标停在变量上 1-2秒,将悬浮显示出变量的当前值,如下图所示:2018/8/8 65.1.3 案例拓展o 若断点在循环内部,则每循环一次都要中断一次,若循环次数庞大,将给调试带来不便。 可以考虑为断点设置条件,在断点上单击鼠标右键,弹出如图所示菜单:2018/8/8 7断点设置o 命中次数在菜单中选择 “命中次数 ”命令,弹出 “断点命中次数 ”窗口(见下图),在下拉框中选择 “中断,条件是命中次数等于 ”,文本框中输入 50,点击确定后,重新启动调试,发现循环内断点在循环到第 50次时才中断,而不是每次都中断。2018/8/8 8断点设置o 断点其他设置 位置:可以设置断点在文件的具体位置。 条件:条件是一个表达式,它确定断点是命中还是跳过。当调试器到达该断点时,它会计算条件的值。只有当条件满足时,断点才会命中。可以在某个位置断点处设置条件,只有当条件为真时,才会中断执行。 命中次数:它跟踪断点的命中次数。默认情况下,每次命中断点时断点都中断代码的执行。您可以更改此行为,以便仅当命中次数等于或超过指定值或者仅当命中次数为给定值的倍数时,断点才中断代码。 通过筛选器,可以将断点设置在指定的计算机、进程和线程上。在调试运行于多个处理器上的应用程序时,筛选器非常有用。2018/8/8 9调试窗口o 监视窗口 只有在中断状态下可以使用该窗口,利用调试工具栏可以打开该窗口。可以在窗口中监视变量或表达式,如图所示。在代码中选中变量或表达式并拖动到监视窗口(或右键选择 “添加监视 ”命令)即可进行监视,也可以在监视窗口的空行中直接输入要监视的变量或表达式。当代码单步执行时,监视变量或表达式的值若发生变化将以红色字体显示。2018/8/8 10调试窗口o 快速监视窗口中断时可以选中变量或表达式后右键选择 “快速监视 ”来使用快速监视对话框进行监视,如下图所示: 2018/8/8 11调试窗口o 即时窗口即时窗口用于调试和计算表达式、执行语句、输出变量值等。它使您得以在调试期间输入表达式,由开发语言对其进行计算或执行。若要显示 “即时 ”窗口,请打开要编辑的项目,然后从 “调试 ”菜单中选择 “窗口 ”,再选择 “即时 ”。 2018/8/8 12调试窗口o 命令窗口“命令 ”窗口用于直接在 Visual Studio 集成开发环境 (IDE) 中执行命令或别名。可以执行菜单命令和不在任何菜单上显示的命令。若要显示 “命令 ”窗口,请从 “视图 ”菜单中选择 “其他窗口 ”,再选择 “命令窗口 ”。 2018/8/8 13调试窗口o 自动窗口“自动 ”窗口用于监视程序运行时最后访问的变量。2018/8/8 14调试窗口o 局部变量窗口“局部变量 ”窗口监视当前执行方法中的变量。与 “自动 ”窗口相比, “局部变量 ”窗口列出了更多的变量。2018/8/8 155.1.4 案例思考o 假设在文本 Log.txt中的空行是在偶数行(例如第 2行是空行),则按前面介绍的语句位置设置断点进行调试是否能检测出问题所在?有无更好的断点位置?如果有,考虑应如何设置断点属性尽快找出问题原因(假设第 100行是空行)。2018/8/8 165.2 错误与异常处理错误的出现并不总是编写应用程序的人的原因,有时应用程序会因为终端用户的操作而发生错误,例如删除只读文件,数据库不存在等。无论如何,我们都应预测应用程序和代码中出现的错误。C#处理错误的机智为每种错误提供定制的处理,并把识别错误的代码与处理错误的代码分离开来,这种机制称为异常处理。2018/8/8 175.2.1 案例功能在图书借阅管理系统中,需要频繁的访问数据库实现图书查询与借还以及读者的管理等。而数据库操作经常会由于数据库不存在、连接密码错误、执行的 SQL语句错误等原因产生异常,最终导致应用程序终止。例如在打开读者管理窗口时,程序将从数据库中读取读者信息显示在窗口上。对应代码如下(在文件ReaderManager.cs内):private void ShowDt()/显示的过程Dt.Clear();Conn.Open();Da.Fill(Dt);Conn.Close();dataGridView1.DataSource = Dt;private void ReaderManger_Load(object sender, EventArgs e)/显示读者表ShowDt(); 2018/8/8 185.2.1 案例功能假设用户修改了数据库,将读者表 Readers中的 ReaderId修改为 Id,则运行时用户如果打开读者管理窗口,程序将弹出如图所示的对话框。2018/8/8 195.2.1 案例功能此时程序将无法继续运行,非法终止。而如果使用了异常处理,则同样的问题将提示如图所示的信息,点击确定后用户可以继续执行应用程序的其他功能。2018/8/8 205.1.2 案例步骤o .NET Framework使用 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();/弹出对话框显示异常信息finallyConn.Close();2018/8/8 21异常处理o 程序的异常处理分为 3种不同类型的代码块: try块包含的代码组成了程序的正常操作部分,但可能遇到某些严重的错误。 catch块包含的代码处理各种错误,这些错误是 try块中的代码执行时遇到的。 finally块包含的代码清理资源或执行要在 try块或 catch块末尾执行的其他操作。无论是否产生异常,都会执行 finally块。 finally块是可选的。如果不需要清理代码,就不需要包含此块。2018/8/8 22异常处理执行步骤o 步骤如下:o 程序流进入 try块。o 如果没有错误发生,就会正常执行操作。当程序流离开 try块后,即使什么也没有发生,也会自动进入 finally块(第 5步)。但如果在 try块中程序检测到一个错误,程序流就会跳转到 catch块(下一步)。o 在 catch块中处理错误。o 在 catch块执行完后,程序流会自动进入 finally块。o 执行 finally块。2018/8/8 23异常处理结构变种 可以省略 finally块 可以提供任意多个 catch块,处理不同类型的错误 可以省略 catch块尽管 catch和 finally是可选的,但不能同时省略。可以使用 throw语句发出在程序执行期间出现反常情况(异常)的信号,使用方法为:throw new 异常类();可以在 catch块中使用无表达式的 throw语句,在此情况下,该语句会再次引发当前正由 Catch 语句处理的异常。可以使用异常处理结构处理 throw抛出的异常。2018/8/8 245.1.3 案例拓展o .NET提供了许多预定义的异常类,如下图所示: ObjectExceptionSystemExceptionApplicationExceptionArgumentExceptionArgumentNullExceptionArgumentOutOfRangeExceptionUnauthorizedAccessExceptionStackOverflowExceptionArithmeticExceptionIOExceptionFileLoadExceptionFileNotFoundExceptionDirectoryNotFoundExceptionEndOfStreamExceptionOverflowException从此处派生出自己的异常类2018/8/8 25异常类o 通常使用异常对象的 Message属性获取异常信息,在System.Exception中还有许多其他属性,如下表: 属 性 说 明Data 这 个属性可以 给 异常添加 键 /值语 句,以提供异常的 额 外信息。这 是 .NET Framework 2.0中的一个新属性HelpLink 链 接到一个帮助文件上,以提供 该 异常的更多信息InnerException 如果此异常是在 catch块 中抛出的,它就会包含把代 码发 送到catch块 中的异常 对 象Message 描述 错误 情况的文本Source 导 致异常的 应 用程序或 对 象名StackTrace 堆 栈 上方法 调 用的信息,它有助于跟踪抛出异常的方法TargetSite 描述抛出异常的方法的 .NET反射 对 象2018/8/8 26捕获多个异常o 一个 try结构可能存在多个 catch块,这是由于 try块中的代码可能引发多种类型的异常,使用多个 catch可以捕获各种异常。 例如:tryint index = Convert.ToInt32(Console.ReadLine();Console.WriteLine(aindex);catch (FormatException ex)Console.WriteLine(“应该输入数字 :“ + ex.Message);catch (IndexOutOfRangeException ex)Console.WriteLine(“索引超出范围 :“ + ex.Message);catch (Exception ex)Console.WriteLine(“其他异常发生 :“ + ex.Message);2018/8/8 27异常处理机制o 与 switch语句的执行方式类似,找到第一个匹配的异常并处理后将不再寻找匹配。o 如果产生的异常未找到匹配, .NET运行库会捕获它。代码的执行会立即中断,并给用户显示一个对话框,说明代码没有处理异常,并给出 .NET运行库能检索到的异常信息。 因此,应捕获尽可能多的异常,并以合理的方式处理它们。 2018/8/8 28try的嵌套o 异常的一个特性是 try块可以嵌套,如下所示:try / Point Atry/ Point Bcatch/ Point Cfin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论