第13章 错误调试和异常处理_第1页
第13章 错误调试和异常处理_第2页
第13章 错误调试和异常处理_第3页
第13章 错误调试和异常处理_第4页
第13章 错误调试和异常处理_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

1、13.1 13.1 错误分类错误分类 13.2 13.2 程序调试程序调试13.3 13.3 异常处理异常处理1. 语法错误语法错误 语法错误也称为编译错误,是由于不正确地编写代码而语法错误也称为编译错误,是由于不正确地编写代码而产生的。如果错误地输入了关键字(例如,将产生的。如果错误地输入了关键字(例如,将int简写为简写为Int)、)、遗漏了某些必须的语句成分等,那么遗漏了某些必须的语句成分等,那么C#在编译应用程序时就在编译应用程序时就会检测到这些错误,并提示相应的错误信息。会检测到这些错误,并提示相应的错误信息。 代码加行号:代码加行号:选择选择“工具工具|选项选项”命令,在出现的命令

2、,在出现的“选项选项”对话框中选择对话框中选择“文本编辑文本编辑器器|C#|常规常规”选项,出现如选项,出现如图图13.2所所示的对话框。例如,勾选示的对话框。例如,勾选“行号行号”则在代码的每一行前显示则在代码的每一行前显示该行的行号,还可以通过选择该行的行号,还可以通过选择“C#”中其他项来设置较复杂中其他项来设置较复杂的编辑功能。的编辑功能。 在在C#项目运行期间,当一个语句试图执行一个不能执行项目运行期间,当一个语句试图执行一个不能执行的操作时,就会发生运行错误。例如,数据溢出、数组下的操作时,就会发生运行错误。例如,数据溢出、数组下标越界等。标越界等。 例如,有一个窗体例如,有一个窗

3、体myForm1上包含以下事件过程:上包含以下事件过程: private void button1_Click(object sender, EventArgs e) int a=new int10; int i; for (i = 0;i=20;i+) ai = 2 * i; 2. 逻辑错误逻辑错误 逻辑错误主要表现在程序执行后,没有提示任何错误逻辑错误主要表现在程序执行后,没有提示任何错误信息且能够正常运行,但得到的结果与预期设想的不一致。信息且能够正常运行,但得到的结果与预期设想的不一致。这有可能是程序设计中出现了逻辑错误,这一类错误属算这有可能是程序设计中出现了逻辑错误,这一类错误属算

4、法设计错误,是最难纠正的,必须使用程序调试工具进行法设计错误,是最难纠正的,必须使用程序调试工具进行错误排查。错误排查。 从上看出,熟练使用程序调试工具是程序员的基本要求,从上看出,熟练使用程序调试工具是程序员的基本要求,是开发和编写是开发和编写C#应用程序的基础。应用程序的基础。 C#提供了强大的程序调试功能,使用其调试环境可以提供了强大的程序调试功能,使用其调试环境可以有效地完成程序的调试工作,从而有助于发现运行错误有效地完成程序的调试工作,从而有助于发现运行错误。1.“调试调试”工具栏工具栏2. “调试调试”菜单菜单13.2.113.2.1调试工具调试工具(2)“调试调试”菜单菜单 断点

5、断点是在程序中设置的一个位置,程序执行到些位置是在程序中设置的一个位置,程序执行到些位置时中断(或暂停)时中断(或暂停)。 断点断点的作用是在调试程序时,当程序执行到断点的语的作用是在调试程序时,当程序执行到断点的语句时会暂停程序的运行,供程序员检查这一位置上程序元句时会暂停程序的运行,供程序员检查这一位置上程序元素的运行情况,这样有助于定位产生错误输出或出错的代素的运行情况,这样有助于定位产生错误输出或出错的代码段码段。 13.2.2 13.2.2 设置断点设置断点 设置设置和取消断点的方法如下:和取消断点的方法如下: 方法方法1:用鼠标右键单击某代码行,从出现的快捷菜单用鼠标右键单击某代码

6、行,从出现的快捷菜单中选择中选择“断点断点|插入插入断点断点”命令(设置断点)或者命令(设置断点)或者“断点断点|删除删除断点断点”命令(取消断点)。命令(取消断点)。 方法方法2:将光标移至需要设置断点的语句处,然后按将光标移至需要设置断点的语句处,然后按F9键。键。 13.2.3 13.2.3 调试过程调试过程1. 开始调试过程开始调试过程 在设置断点后,从在设置断点后,从“调试调试”菜单中选择菜单中选择“启动调试启动调试”、“逐语句逐语句”或或“逐过程逐过程”命令,或者在代码编辑窗口中,单命令,或者在代码编辑窗口中,单击鼠标右键,然后从快捷菜单中选择击鼠标右键,然后从快捷菜单中选择“运行

7、到光标处运行到光标处”命令,命令,即开始调试过程。即开始调试过程。 如果选择如果选择“启动调试启动调试”命令(或命令(或F5键),则应用程序键),则应用程序启动并一直执行到断点。可以在任何时刻中断执行以检查启动并一直执行到断点。可以在任何时刻中断执行以检查值或检查程序状态。例如,在设置图值或检查程序状态。例如,在设置图3.4的断点后,选择的断点后,选择“调试调试|启动调试启动调试”命令,程序执行到断点,如图命令,程序执行到断点,如图13.5所示。所示。2. 查看调试信息查看调试信息 在程序调试的中断状态下,可以通过多种窗口观察变在程序调试的中断状态下,可以通过多种窗口观察变量的值。量的值。 智

8、能感知窗口智能感知窗口。将鼠标放在希望观察的执行过语句。将鼠标放在希望观察的执行过语句的变量上,调试器会通过智能感知窗口自动显示执行到断的变量上,调试器会通过智能感知窗口自动显示执行到断点时该变量的值。点时该变量的值。 即时窗口即时窗口。此时选择。此时选择“调试调试|窗口窗口|即时即时”命令,出现命令,出现即时窗口。可以输入即时窗口。可以输入“?变量或表达式变量或表达式”来显示变量或表达来显示变量或表达式的值。如图式的值。如图13.8所示。所示。 局部变量窗口局部变量窗口。此时选择。此时选择“调试调试|窗口窗口|局部变量局部变量”命命令,出现局部变量窗口,它自动显示当前过程中所有的变令,出现局

9、部变量窗口,它自动显示当前过程中所有的变量值,如图量值,如图13.9所示。所示。 快速监视窗口快速监视窗口。此时在某个对象上或空白处单击鼠。此时在某个对象上或空白处单击鼠标右键,从弹出的快捷菜单中选择标右键,从弹出的快捷菜单中选择“快速监视快速监视”命令,出命令,出现快速监视窗口,它用于显示用户在现快速监视窗口,它用于显示用户在“表达式表达式”文本框中文本框中输入的表达式的值,如图输入的表达式的值,如图13.10所示。所示。 在程序开始调试过程后,每次处于中断状态时,用户通在程序开始调试过程后,每次处于中断状态时,用户通过上述窗口观察变量或表达式的值,然后按过上述窗口观察变量或表达式的值,然后

10、按F5继续,从而跟继续,从而跟踪变量或表达式的变化过程,最终找出程序出错的原因。踪变量或表达式的变化过程,最终找出程序出错的原因。 【例例13.1】创建一个创建一个Windows窗体应用程序窗体应用程序proj13-2项目,项目,其中有一个窗体其中有一个窗体Form1,它的功能是求,它的功能是求1020之间的所有素之间的所有素数,它的设计界面如图数,它的设计界面如图13.11所示。有一个文本框所示。有一个文本框textBox1(其(其MultiLine属性设置为属性设置为true)和一个命令按钮)和一个命令按钮button1。该窗体上有如下事件过程:该窗体上有如下事件过程:private vo

11、id button1_Click(object sender, EventArgs e) int i, j; bool flag; string mystr=“”; for (i = 10;i=20;i+) flag = true;for (j = 3;j=Math.Sqrt(i);j+) if (i%j = 0) flag = false; break; if (flag = true) mystr = mystr + i.ToString() + ; textBox1.Text = mystr; 执行本窗体,单击执行本窗体,单击“求求10到到20的素数的素数”命令按钮,结果命令按钮,结果如

12、图如图13.12所示。从中看到结果是错误的,因为所示。从中看到结果是错误的,因为10、14均不是均不是素数。素数。 解:解:打开代码编辑窗口,将打开代码编辑窗口,将button1_Click事件过程中事件过程中的的if行设置为断点,如图行设置为断点,如图13.13所示。然后按所示。然后按F5键或单击键或单击 启启动本窗体,单击动本窗体,单击“求求10到到20的素数的素数”命令按钮,程序执行命令按钮,程序执行在所设置的断点处中断,并进入中断状态,如图在所设置的断点处中断,并进入中断状态,如图13.12所示。所示。此时查看变量的值并查找出错原因:此时查看变量的值并查找出错原因: 智能感知窗口智能感

13、知窗口。将鼠标放在断点行的。将鼠标放在断点行的i变量上,智能变量上,智能感知窗口显示的感知窗口显示的i变量的值,如图变量的值,如图13.14所示。也可以查看所示。也可以查看此时变量此时变量j的值(的值(j=4)。)。 即时窗口即时窗口。在即时窗口中输入。在即时窗口中输入“?flag”后按回车键,后按回车键,显示其值为显示其值为true,再输入,再输入“?i”后按回车键,显示后按回车键,显示i的值为的值为10,最后输入,最后输入“?j”后按回车键,显示后按回车键,显示j的值为的值为4,如图,如图13.15所示。所示。 局部变量窗口局部变量窗口。此时局部变量窗口如图。此时局部变量窗口如图13.16

14、所示。所示。 快速监视窗口快速监视窗口。此时快速监视窗口如图。此时快速监视窗口如图13.17所示。所示。 从上看到,当从上看到,当i=10时,时,j=34时,时,i % j不为不为0,从而得,从而得出出i=10为素数的结论。实际上为素数的结论。实际上i=10为偶数,所有的偶数都为偶数,所有的偶数都不是素数,如果将不是素数,如果将j=34的判断改为的判断改为j=24,则不可能得,则不可能得到到i=10为素数的错误结论。上述为素数的错误结论。上述4种调试方法都可以找到错种调试方法都可以找到错误的原因,只需将:误的原因,只需将:for (j=3;j=Math.Sqrt(i);j+)改为改为for (

15、j=2;j=Math.Sqrt(i);j+)13.3.1 13.3.1 异常概述异常概述 异常是指在程序执行期间发生的错误或意外情况,例异常是指在程序执行期间发生的错误或意外情况,例如整数除零错误或内存不足警告时,就会产生一个异常。如整数除零错误或内存不足警告时,就会产生一个异常。 如果给定异常没有异常处理程序,则程序将停止执行,如果给定异常没有异常处理程序,则程序将停止执行,并显示一条错误信息,因此对程序中的异常处理是非常重并显示一条错误信息,因此对程序中的异常处理是非常重要的,一般情况下,在一个比较完整的程序中要尽可能考要的,一般情况下,在一个比较完整的程序中要尽可能考虑可能出现的各种异常

16、,这样当发生异常时,控制流将立虑可能出现的各种异常,这样当发生异常时,控制流将立即跳转到关联的异常处理程序(如果存在)。即跳转到关联的异常处理程序(如果存在)。1. trycatch语句语句try/可能产生异常的程序代码可能产生异常的程序代码catch(异常类型异常类型1异常类对象异常类对象1)/处理异常类型处理异常类型1的异常控制代码的异常控制代码catch(异常类型异常类型n异常类对象异常类对象n)/处理异常类型处理异常类型n的异常控制代码的异常控制代码【例例13.2】 创建一个控制台应用程序创建一个控制台应用程序Proj12-2项目,通项目,通过过trycatch语句捕捉整数除零错误。语

17、句捕捉整数除零错误。 namespace proj13_2 class Program static void Main(string args) int x = 5,y = 0; try /try.catch语句语句 x = x/y; /引发除零错误引发除零错误 catch (Exception err) /捕捉该错误捕捉该错误 Console.WriteLine(0,err.Message); /显示错误信息显示错误信息 输出输出:尝试除以零。:尝试除以零。2. trycatchfinally语句语句 同同trycatch语句相比,语句相比,trycatchfinally语句增加了语句增加

18、了一个一个finally块,其作用是不管是否发生异常,即使没有块,其作用是不管是否发生异常,即使没有catch块,都将执行块,都将执行finally块中的语句,也就是说,块中的语句,也就是说,finally块始终会块始终会执行,而与是否引发异常或者是否找到与异常类型匹配的执行,而与是否引发异常或者是否找到与异常类型匹配的catch块无关。其余与块无关。其余与trycatch语句相同。语句相同。 finally块通常用来释放资源,而不用等待由运行库中的块通常用来释放资源,而不用等待由运行库中的垃圾回收器来终结对象。垃圾回收器来终结对象。 归纳起来,在归纳起来,在try块的代码出现异常后,其处理过

19、程的块的代码出现异常后,其处理过程的顺序如下:顺序如下: try块在发生异常的地方中断程序的执行。块在发生异常的地方中断程序的执行。 如果有如果有catch块,就检查该块是否与已发生的异常类型匹配。块,就检查该块是否与已发生的异常类型匹配。 如果有如果有catch块,但它与已发生的异常类型不匹配,就检查是否块,但它与已发生的异常类型不匹配,就检查是否有其他有其他catch块。块。 如果有如果有catch块与已发生的异常类型匹配,就执行它包含的代码,块与已发生的异常类型匹配,就执行它包含的代码,再执行再执行finally块(如果有)。块(如果有)。 如果所有如果所有catch块都与已发生的异常类

20、型不匹配,就执行块都与已发生的异常类型不匹配,就执行finally块(如果有)。块(如果有)。【例例13.3】 创建一个控制台应用程序创建一个控制台应用程序Proj12-3项目,说明项目,说明finally块的作用。块的作用。namespace proj13_3 class Program static void Main(string args) int s = 10, i; int a = new int5 1, 2, 3, 0, 4 ; try for (i = 0; i a.Length; i+) Console.Write(0 , s / ai); Console.WriteLine

21、(); catch (Exception err) Console.WriteLine(0, err.Message); finally Console.WriteLine(执行执行finally块块); 运行结果运行结果3. throw语句语句throw语句有两种使用方式:语句有两种使用方式: (1)直接抛出异常;)直接抛出异常; (2)在出现异常时,通过含有)在出现异常时,通过含有catch块对其进行处理并块对其进行处理并使用使用throw语句重新把这个异常抛出并让调用这个方法的程语句重新把这个异常抛出并让调用这个方法的程序进行捕捉和处理。序进行捕捉和处理。throw语句的使用语法格式如下:语句的使用语法格式如下: throw 表达式表达式; 其中其中“表达式表达式”类型必须是类型必须是System.Exception或从或从System.Exception派生的类的类型。派生的类的类型。 throw语句也可以不带语句也可以不带“表达式表达式”,此时只能用在,此时只能用在catch块中,在这种情况下,它重新抛出当

温馨提示

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

最新文档

评论

0/150

提交评论