1、ACCP V4.0,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第七章,调试、测试和异常处理,目标,理解如何调试应用程序和排除错误,掌握如何测试,C#,应用程序,了解测试和调试的区别,在程序中进行错误捕获和错误处理,2,简介,应用程序开发,可以安装在客户端机器上,应用程序必须,无错误,无故障,可靠,稳健,查找和排除,错误或故障称为,调试,3,调试的必要性,计算机化的计费系统,在事物处理过程中,系统显示错误消息,系统发生故障,必须重新输入全部信息,在部署应用程序前必须先对其进行调试
2、4,错误类型,错误类型,语法错误,逻辑错误,运行时错误,语法错误、缺少括号等,在编译时确定,易于确定,错误的算法导致错误结果、公式错误等,在执行过程中确定,难以调试,内存泄漏、以零作除数、异常,在运行时确定,难以调试,5,调试过程,5-1,调试器,观察程序的运行时行为,跟踪变量的值,确定语义错误的位置,查看寄存器的内容,查看内存空间,6,调试过程,5-2,暂停,可在代码中插入“断点”,以便在特,定行处暂停执行该代码,7,调试过程,5-3,右键单击所需代码行,以设置断点,选择“插入断点”,8,调试过程,5-4,选择“调试”,“,继续”以便继续执行程序,9,VS.NET,中的调试工具,5-1,“
3、局部变量”窗口,10,VS.NET,中的调试工具,5-2,“,监视”窗口,11,VS.NET,的调试工具,5-3,“,快速监视”对话框,12,VS.NET,中的调试工具,5-4,“,即时”窗口,13,VS.NET,中的调试工具,5-,5,跨语言调试,调试使用,.NET,框架编写的应用程序以及,Win32,本,机应用程序,加入正在运行的程序,调试多个程序,Visual Studio.NET,调试器的功能,14,调试过程,.NET,集成开发环境,Debug,模式,Release,模式,15,异常,帐户,姓名,余额,300123,张三,300124,王五,47,000,311320,李四,网上银行
4、张三转帐,25000,到李四的帐面上,0,20,000,数据库,系统将查询发送到数据库中,tranfer_money,(),sendquery,();,.,.,余额,20000-25000,程序崩溃,拒绝交易,错误,系统出现故障,“,C#,”,中的异常,16,C#,中的异常处理,2-1,.,INPUT Divisor,IF Divisor=0 THEN,Result=Divident/Divisor,.,代码片段,1,输入除数,结果,=,_,0,2,4,GOTO PREVIOUS LINE,触发异常处理程序,17,C#,中的异常处理,2-,2,.,INPUT Divisor,Result=D
5、ivident/Divisor,.,代码片段,1,“,用户自定义”错误检查机制,难以检查输入的任何“特殊字符”,IF Divisor=0 THEN GOTO PREVIOUS LINE,IF Divisor 0 THEN PRINT,“,无效输入”,运行库,运行库应当提供,“错误检查机制”,18,System.Exception,3-1,19,System.Exception,3-2,属性,Message,Source,StackTrace,InnerException,20,System.Exception,3-3,在,C#,程序中,引发异常共有以下两种方式,使用显式,throw,语句来引发
6、异常。在此情况下,控制权将无条件转到处理异常的部分代码,使用语句或表达式在执行过程中激发了某个异常的条件,使得操作无法正常结束,从而引发异常,Try.Catch.Finally,21,try,和,catch,块,4-1,滤水器,filter_water,(),try,water();,catch,impurities.Show,();,.,.,过滤水,杂质,/,程序代码,/,错误处理代码,try,/,程序代码,catch,(,IOException,E),/,错误处理代码,22,try,和,catch,块,4-2,try,/,程序代码,catch,(,IOException,E),/,错误处理
7、代码,I/O,设备可以生成错误,23,try,和,catch,块,4-3,try,/,程序代码,catch,(,E),/,错误处理代码,可处理系统中的,任何,一种,异常,System.Exception,24,try,和,catch,块,4-4,if(,UserInput,100),throw new,InvalidNumberInput,(,UserInput,+“,不是有效输入,(,请输入,1,和,100,之间的数字,)”);,throw,可用来引发自定义异常,“,InvalidNumberInput,”,25,使用,finally,try,/,程序代码,catch,/,错误处理代码,fi
8、nally,/finally,代码,无论,控制流,如何都会执行,26,多重,catch,块,2-1,try,/,程序代码,catch,(,IOException,E),/,错误处理代码,catch,(,OutOfMemoryException,E),/,错误处理代码,用于捕捉两种异常的,“,catch,”,块,27,多重,catch,块,2-2,public class,MyCustomException,:,System.ApplicationException,public,MyCustomException(string,message):base(message,),try,quoti
9、ent=dividend/divisor;,catch(MyCustomExeption,ex),Console.WriteLine(ex.Message,);,.,.,if(divisor,=0),throw new,MyCustomException,(“,除数不能为零,);,28,示例,-,建立自定义异常,using System;,public class,EmailErrorException:ApplicationException,public string _message;,/,重写构造函数,public,EmailErrorException():base,(),_mess
10、age=null;,public,EmailErrorException(string,message):base,(),_message=,message.ToString,();,public,EmailErrorException(string,message,Exception,myNew):base(message,myNew,),_message=,message.ToString,();,/Message,属性的重载,public override string Message,get,return Email,格式错误。,;,29,示例,-throw,自定义异常,private
11、bool,SaveInfo(string,name,string email),string,subStrings,=,email.Split,();,/,如果输入的,Email,不是被“,”,字符分割成两段,则抛出,Email,错误异常,if(subStrings.Length,!=2),throw new,EmailErrorException,();,else,int,index=subStrings1.IndexOf(.);,/,查找被“,”,字符分成的两段的后一段中“,.”,字符的位置,没有“,.”/,或者“,.”,字符是第一个字符,则抛出,EmailErrorException,
12、异常,if(index,=0),throw new,EmailErrorException,();,/,如果“,.”,字符是最后一个字符,抛出,EmailErrorException,异常,if(subStrings1subStrings1.Length-1=.),throw new,EmailErrorException,();,return true;,30,示例,-Catch,自定义异常,private void,btnSubmit_Click(object,sender,System.EventArgs,e),if(txtName.Text.Length,=0&,txtEmail.Te
13、xt.Length,=0),MessageBox.Show,(,请填写姓名和,Email,。,填写不完整,MessageBoxButtons.OK,MessageBoxIcon.Information,);,return;,try,SaveInfo(txtName.Text,txtEmail.Text,);,catch(EmailErrorException,ex),MessageBox.Show(ex.Message,Email,格式错误,System.Windows.Forms.MessageBoxButtons.OK,MessageBoxIcon.Information,);,return;,MessageBox.Show,(,保存成功。,成功,MessageBoxButtons.OK,MessageBoxIcon.Information,);,31,总结,调试是搜寻和消除应用程序中的错误的过程,语法错误表示编译器无法理解代码,调试模式可用来重复编译和排除应用程序中的错误,直至能够成功运行,“局部变量”窗口允许用户监控当前程序中所有变量的值,单元测试和集成测试是测试大型应用程序的常用技术,当应用程序遇到运行时错误时,就会引发异常,C#,中的所有异常都派生自,Exception,类,32,






