第14章 异常处理与跟踪调试.doc_第1页
第14章 异常处理与跟踪调试.doc_第2页
第14章 异常处理与跟踪调试.doc_第3页
第14章 异常处理与跟踪调试.doc_第4页
第14章 异常处理与跟踪调试.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

第14章 异常处理与跟踪调试在程序编制的过程中,总是没有办法避免错误,然而,对于使用方法引发的错误要在程序的执行过程中尽可能做出处理,以便使我们说的异常处理;另外,对于每个比较大的软件来说,在程序测试的过程中往往会出现错误,但是,查找错误的位置要比改正错误难得多,所以,对于一个开发平台,C#提供了多种调试方法。本章简单了解异常处理与跟踪调试。14.1 异常处理在任何情况下,程序都不能是完美无缺,毫无错误的,所以在程序的编制过程中,程序都必须能处理可能出现的错误,C#提供处理错误的机制,即使用异常类Exception为每种错误提供定制的处理,并把识别错误的代码和处理错误的代码分离开来。C#提供的结构化处理异常的方法,使用try语句提供的控制结构检测代码中的异常并做出相应的处理。try语句有三种方式:l 用try-catch 捕获异常l 用try-finally 清除异常l 用try-catch-finally 处理所有的异常14.1.1 try-catch捕获异常正常情况下,程序流进入try控制块,如果没有错误发生,就会正常操作。当程序流离开try控制块后,如果没有发生错误,将执行catch后的finally语句块或顺序执行;当执行try时发生错误,程序留就会跳转到相应的catch语句块。如【例14-1】。【例14-1】在TextBox控件中接受两个数,计算它们的商。该例中需要从利用TextBox的Text属性接受数字,因为Text属性值描述的类型为字符串型,所以在程序运行的过程中,可能引发异常;另外,除数不能为0,否则,引发异常。程序的界面设置如图14-1。 图14-1 界面设计 图14-2 由a引发的异常“计算a/b”的代码如下:private void button1_Click(object sender, System.EventArgs e) int a=1,b=1, c=1;try a=Convert.ToInt32(textBox1.Text);catchMessageBox.Show(请将a的值输入为数字);return;tryb=Convert.ToInt32(textBox2.Text);catchMessageBox.Show(请将b的值输入为数字);return;tryc=a/b;catch(DivideByZeroException)MessageBox.Show(除数不能为 );return;MessageBox.Show(整数a与整数b的商为+c.ToString(); 图14-3 由b引发的异常 图14-4 除数为0的异常 图14-5 正常情况程序的运行结果: 当在textBox1中输入不是数字时,入图14-3,引发下面的异常:catchMessageBox.Show(请将a的值输入为数字);return; 当在textBox2中输入不是数字时,入图14-4,引发下面的异常:catchMessageBox.Show(请将b的值输入为数字);return; 当在textBox2中输入数据为0时,将引发除数不能为0的异常,如图14-4。 正常情况下,结果为两个数相除得到的整数,如图14-5所示。14.1.2 try-finally 清除异常如果你关心清除异常而不是错误处理,try-finally清除异常能帮助你实现。它不仅抑制了出错消息,而且所有包含在finally 块中的代码在异常被引发后仍然会被执行。尽管程序不正常终止,但你还可以为用户获取一条消息,如【例14-2】【例14-2】检查文件是否存在,退出时显示“谢谢您使用本软件”。本例中检查文件的存在与否,使用try-finally清除异常实现消息的显示。当文件存在时运行结果如图14-6所示;当文件不存在时运行结果如图14-7所示。代码如下:private void button1_Click(object sender, System.EventArgs e)tryif(File.Exists(textBox1.Text) label2.Text=该文件存在;elselabel2.Text=该文件不存在;finallyMessageBox.Show(谢谢您使用本软件!); 图14-6 文件存在 图14-7 文件不存在14.1.3 用try-catch-finally 处理所有的异常应用程序最有可能的途径是合并前面两种错误处理技术捕获错误、清除并继续执行应用程序。所有你要做的是在出错处理代码中使用try-catch-finally语句。如将【例14-3】。【例14-3】在【例14-1】的基础上,将a或b引发异常的情况合并,无论怎样发生异常,程序将改为下面的代码:private void button1_Click(object sender, System.EventArgs e)int a=1,b=1, c=1;trya=Convert.ToInt32(textBox1.Text);b=Convert.ToInt32(textBox2.Text);c=a/b;MessageBox.Show(a/b的值为+c.ToString();catch(FormatException)MessageBox.Show(请将a或b的值输入为数字);catch(DivideByZeroException)MessageBox.Show(除数不能为 );finally MessageBox.Show(无论发生什么异常,我都会显示);该例中,try语句使用两个捕获异常的语句实现对两数相除时可能引发的错误,使用finally语句实现对所有的异常进行处理。在异常的处理中,首先捕获特定的异常,接着是普通的异常。如果你不按这个顺序捕获异常,一些异常可能捕捉不到,也可能出现错误。14.1.4 抛出异常当你必须捕获异常时,其他人首先必须首先能够引发异常。而且,不仅其他人能够引发,你也可以负责引发。throw方法用于引发一个异常,当使用该方法时,可以对方法调用时出现的异常进行描述。如程序中使用下列语句:throw new DivideByZeroException(除数不能为0!);则在引发DivideByZeroException异常时显示“除数不能为0!”的信息。14.1.5 常用的异常类表14-1给出了System名称空间中常用的异常类。表14-1 常用的异常类异常类描述MemberAccessException问错误:类型成员不能被访问ArgumentException 参数错误:方法的参数无效ArgumentNullException 参数为空:给方法传递一个不可接受的空参数ArithmeticException 数学计算错误:由于数学运算导致的异常,覆盖面广ArrayTypeMismatchException 数组类型不匹配DivideByZeroException 被零除FormatException参数的格式不正确 IndexOutOfRangeException 索引超出范围,小于0或比最后一个元素的索引还大InvalidCastException 非法强制转换,在显式转换失败时引发MulticastNotSupportedException 不支持的组播:组合两个非空委派失败时引发NotSupportedException 调用的方法在类中没有实现NullReferenceException 引用空引用对象时引发OutOfMemoryException 无法为新语句分配内存时引发,内存不足OverflowException 溢出StackOverflowException栈溢出 TypeInitializationException错误的初始化类型:静态构造函数有问题时引发 NotFiniteNumberException无限大的值:数字不合法14.1.6 用户自定义异常除了预定义的异常外,我们还可以通过继承Exception创建自己的异常类,过程比较简单:声明一个异常,格式如下:class ExceptionName:Exception引发自己的异常的格式如下:throw(ExceptionName);如以下代码实现了MyImportantException类的定义。using System; public class MyImportantException:Exception public MyImportantException() :base() public MyImportantException(string message) :base(message) public MyImportantException(string message, Exception inner) :base(message,inner) 14.2 跟踪和调试14.2.1 跟踪使用ASP开发应用程序时,一般将输入输出语句插入到代码中,以输出变量或结构、断言是否满足条件或者只是通过应用程序的执行路径进行的一般跟踪。在.NET中,针对调试检查运行情况和处理错误等方面,提供了两种级别的跟踪服务:页面级跟踪及应用程序级跟踪。提供了处理跟踪和断言的两个类:Trace 和 Debug,这两个类都来自 System.Diagnostics 命名空间。14.2.2 调试调试是为了发现错误并修改的过程,在C#中主要表现在以下几方面: 输出调试信息。 在执行应用程序的过程中,查看并编辑变量。 暂停程序、重新启动程序 在代码的某个位置自动暂停程序执行一次执行程序中的一行代码。 在应用程序执行的过程中,监视变量的改变。下面介绍调试的几种方法1. 正常模式下的调试在程序中使用输出语句监视程序运行情况,如在控制台程序中,使用Consol.WriteLine()函数实现输出,如想查看一个函数f()的运行情况,可以在程序中添加Console.WriteLing(要调用函数f();f(100);Console.WriteLing(已经调用了函数f();可以使用图14-8解决方案配置实现调试的目的。图14-8 解决方案配置2. 中断模式下的调试即如中断模式的最简单方式是在运行应用程序时,单击暂停按钮,然后通过启动按钮和重新启动按钮实现程序的启动,也可以使用全部中断按钮实现程序中断。3. 设置断点断点是源代码运行过程中进入中断的一个标记,可以在多种情况下发生中断: 遇到断点,立即进入中断模式。 遇到断点,如果表达式的值为真,则进入中断模式。 遇到某断点一定的次数后,进入中断模式。 遇到断点时就进入中断模式,且从上次遇到断点以来变量的值发生了变化。添加断点有三种方法: 如果在某代码行添加断点,可以单击该代码行左边的区域,或者右击该代码行,弹出如图14-9所示的菜单项,选择“插入断点”。断点在该代码行的旁边显示一个红色的圆点,代码行突出显示。 通过菜单“调试”设置断点。在菜单上选择“调试”,然后在菜单项中选择“新断点”,弹出如图14-10所示的“新断点”窗口,从而进行相应的设置。并且,使用同样的方法可以“清除所有断点”和“禁用所有断点”。 图14-9 设置断点菜单 图14-10 设置新断点对话框 单击工具栏上的“”断点图表进行设置断点。4. 监视变量运行在中断方式下,可以设置监视,用于显示变量的信息。5. 逐语句和逐过程执行6. 使用Trace 和 Debug处理这两个类都来自 System.Diagnostics 命名空间。Tra

温馨提示

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

评论

0/150

提交评论