第8章 调试、测试和异常处理.ppt
ZJWCHC第7章调试、测试和异常处理目标理解如何调试应用程序和排除错误在程序中进行错误捕获和错误处理2简介应用程序开发可以安装在客户端机器上应用程序必须无错误无故障 可靠 稳健查找和排除错误或故障称为调试38.1 调试在事物处理过程中,系统显示错误消息系统发生故障必须重新输入全部信息在部署应用程序前必须先对其进行调试48.1.1 错误类型错误类型语法错误逻辑错误运行时错误l 语法错误、缺少括号等l 在编译时确定l 易于确定l 错误的算法导致错误结果、公式错误等 l 在执行过程中确定l 难以调试l 内存泄漏、以零作除数、异常l 在运行时确定l 难以调试58.1.2 调试过程 调试器观察程序的运行时行为 跟踪变量的值确定语义错误的位置查看寄存器的内容查看内存空间 6调试过程 5-2暂停可在代码中插入“断点”,以便在特定行处暂停执行该代码7调试过程 5-3右键单击所需代码行,以设置断点选择“插入断点”8调试过程 5-4选择“调试”“继续”以便继续执行程序9调试模式.NET 集成开发环境Debug 模式(调试):可用来重复编译应用程序和排除错误,直至能够成功运行。Release 模式(发布):当应用程序无需重复编译即可发布时,再改成发布模式编译,然后发布 10 8.1.2 VS.NET 中的调试工具“局部变量”窗口:显示当前作用域下的变量并跟踪他们的值,控制权一旦转移到其他方法,则系统会自动清除列出的变量,显示当前方法的变量。11“监视”窗口:“监视”窗口:用计算变量和表达式的值,并跟踪他们的变化。12“快速监视”对话框:“快速监视”对话框:快速计算变量和表达式的值。13“即时”窗口:“即时”窗口:用于检查变量的值,给变量赋值以及运行一行代码。要查找变量的值,必须在变量名前加“?”。14 Visual Studio.NET 调试器的功能跨语言调试 调试使用.NET 框架编写的应用程序以及 Win32 本机应用程序加入正在运行的程序调试多个程序158.2 异常帐户 姓名 余额300123 小王300124 小黄 7000311320 小李网上银行某学生小王转帐5000 到其朋友小李的帐面上04500数据库系统将查询发送到数据库中tranfer_money()sendquery();.余额 4500-5000 程序崩溃拒绝交易错误 系统出现故障“C#”中的异常 161.异常(Exception)异常(Exception):异常是当程序发生错误时产生的一种信号。在.Net广泛使用的原因:除数为0;数组下标出界,或没用引用,文件找不到举例:string s;int i;s=textBox1.Text;i=int.Parse(s);172.异常类型每种异常类型都是一个类。所有异常派生于基类基类 Exception 下存在两大类异常:System.SystemException:预定义公共语言运行库异常类。System.ApplicationException:用户定义的应用程序异常类。可以通过异常类名判断是哪类异常:ArithmeticException:数学计算错误DivideByZeroException:被零除 FormatException:参数的格式不正确 18异常类19异常类的常用属性属性Message:描述错误信息Source:显示异常发生时的应用程序或对象名StackTrace:显示异常发生时的堆栈信息InnerException:对内部异常的引用203.异常处理异常处理:异常处理是指处理程序运行时出现异常的方法。以前用代码号(如C)来描述异常,C#则用异常类(Exception)对象来处理异常.异常处理方式异常的产生:通过抛出(throwing)一个该异常类的对象实现异常的捕获:通过catch该异常类的对象实现异常处理有try-catch方法21异常处理举例int i=0;try i=Convert.ToInt32(textBox1.Text);/若textBox1.Text值为非int则捕获异常,执行catch的代码进行异常处理catch(Exception ex)MessageBox.Show(ex.Message);224.异常处理语句在 C#程序中,引发异常共有以下两种方式l 使用语句或表达式在执行过程中激发了某个异常的条件,使得操作无法正常结束,从而引发异常l 使用显式 throw 语句来引发异常。在此情况下,控制权将无条件转到处理异常的部分代码Try.Catch.Finally231)try 语句C#使用try语句来捕捉和处理程序执行过程中产生的异常。try语句提供一种在执行一个语句块时能够抓住异常的机制.格式:try 程序代码块;/我们应该把有可能发生异常的该代码放置在try中.catch(Exception ex)异常处理代码块;/捕捉到异常后的处理方法放置到catch中。finally 无论是否发生异常,均要执行的代码块;24举例:int i=0;try i=Convert.ToInt32(textBox1.Text);catch(FormatException ex)/字符格式异常 MessageBox.Show(ex.Message);catch(Exception ex)/处理系统中的任何一种异常 MessageBox.Show(ex.Message);finally MessageBox.Show(测试完毕);25try 语句说明try语句通常包含 try子句、catch子句和 finally子句,总共有三种可能的try语句形式:trycatch:后面跟有一个或多个catch语句块的try语句块。tryfinally:后面跟有一个finally的try语句块。trycatchfinally:后面既跟有catch又跟有finally的try语句块。try子句包含可能发生异常的语句块,catch子句包含用来处理或者响应异常的语句块。catch子句执行后,程序将继续执行。若要处理异常后中止程序,则须用return、throw或exit.finally子句,无论 try子句是否引发异常,该子句包含的语句块总被执行,因此,finally子句可以用来进行一些必要的清除操作,如释放对象占用的资源等。262)throw语句Throw:人工抛出异常Throw格式1:throw;说明:带有表达式的throw语句抛出的异常是在计算这个表达式时产生的表达式须是 System.Exception类型值,或从 Sytem.Exception继承而来的类类型。如果计算表达式的结果是 null,一个NullReferenceException异常将会被抛出。格式2:throw;不带表达式的throw语句只能用在一个catch语句块中,在一个catch块中,可以用不含表达式的throw语句将该catch块捕捉到的异常再次抛出,对于异常变量的分配不会改变再次抛出的异常。异常传播:当一个异常被抛出以后,程序将控制权转移给try语句中第一个能够处理该异常的catch子句。这个从异常抛出到控制转移给合适的异常处理语句的过程就叫做异常传播。27 throw 举例 try if(textBox1.Text=)throw new Exception(不能为空);catch(Exception ex)MessageBox.Show(ex.Message);285.自定义异常类创建1.创建一个ApplicationException子类,空值异常 public class MyException:System.ApplicationException/重写构造函数 public MyException():base()/Message属性的重载 public override string Message get return 不允许为空值;29引发自定义异常2.在程序方法中可以通过throw语句引发异常 if(textBox1.Text=)throw new MyException();30