ZJWCHC第7章调试、测试和异常处理2目标理解如何调试应用程序和排除错误在程序中进行错误捕获和错误处理3简介应用程序开发可以安装在客户端机器上应用程序必须无错误无故障可靠稳健查找和排除错误或故障称为调试48.1调试在事物处理过程中,系统显示错误消息系统发生故障必须重新输入全部信息在部署应用程序前必须先对其进行调试58.1.1错误类型错误类型语法错误逻辑错误运行时错误语法错误、缺少括号等在编译时确定易于确定错误的算法导致错误结果、公式错误等在执行过程中确定难以调试内存泄漏、以零作除数、异常在运行时确定难以调试68.1.2调试过程调试器观察程序的运行时行为跟踪变量的值确定语义错误的位置查看寄存器的内容查看内存空间7调试过程5-2暂停可在代码中插入“断点”,以便在特定行处暂停执行该代码8调试过程5-3右键单击所需代码行,以设置断点选择“插入断点”9调试过程5-4选择“调试”“继续”以便继续执行程序10调试模式.NET集成开发环境Debug模式(调试):可用来重复编译应用程序和排除错误,直至能够成功运行。Release模式(发布):当应用程序无需重复编译即可发布时,再改成发布模式编译,然后发布118.1.2VS.NET中的调试工具“局部变量”窗口:显示当前作用域下的变量并跟踪他们的值,控制权一旦转移到其他方法,则系统会自动清除列出的变量,显示当前方法的变量。12“监视”窗口:“监视”窗口:用计算变量和表达式的值,并跟踪他们的变化。13“快速监视”对话框:“快速监视”对话框:快速计算变量和表达式的值。14“即时”窗口:“即时”窗口:用于检查变量的值,给变量赋值以及运行一行代码。要查找变量的值,必须在变量名前加“?”。15VisualStudio.NET调试器的功能跨语言调试调试使用.NET框架编写的应用程序以及Win32本机应用程序加入正在运行的程序调试多个程序168.2异常帐户姓名余额300123小王300124小黄7000311320小李网上银行某学生小王转帐5000到其朋友小李的帐面上04500数据库系统将查询发送到数据库中tranfer_money(){sendquery();}…….…….余额=4500-5000程序崩溃拒绝交易错误系统出现故障“C#”中的异常171.异常(Exception)异常(Exception):异常是当程序发生错误时产生的一种信号。在.Net广泛使用的原因:除数为0;数组下标出界,或没用引用,文件找不到举例:strings;inti;s=textBox1.Text;i=int.Parse(s);182.异常类型每种异常类型都是一个类。所有异常派生于基类基类Exception下存在两大类异常:System.SystemException:预定义公共语言运行库异常类。System.ApplicationException:用户定义的应用程序异常类。可以通过异常类名判断是哪类异常:ArithmeticException:数学计算错误DivideByZeroException:被零除FormatException:参数的格式不正确19异常类System.ExceptionSystem.SystemExceptionSystem.ApplicationExceptionSystem.ArithmeticExceptionSystem.Data.DataExceptionSystem.ArgumentExceptionSystem.FormatExceptionSystem.IO.IOExceptionSystem.DivideByZeroExceptionSystem.OverflowExceptionSystem.Reflection.TargetExceptionSystem.IndexOutOfRangeExceptionSystem.ArgumentNullException20异常类的常用属性属性Message:描述错误信息Source:显示异常发生时的应用程序或对象名StackTrace:显示异常发生时的堆栈信息InnerException:对内部异常的引用213.异常处理异常处理:异常处理是指处理程序运行时出现异常的方法。以前用代码号(如C)来描述异常,C#则用异常类(Exception)对象来处理异常.异常处理方式异常的产生:通过抛出(throwing)一个该异常类的对象实现异常的捕获:通过catch该异常类的对象实现异常处理有try-catch方法22异常处理举例inti=0;try{i=Convert.ToInt32(textBox1.Text);}//若textBox1.Text值为非int则捕获异常,执行catch的代码进行异常处理catch(Exceptionex){MessageBox.Show(ex.Message);}234.异常处理语句在C#程序中,引发异常共有以下两种方式使用语句或表达式在执行过程中激发了某个异常的条件,使得操作无法正常结束,从而引发异常使用显式throw语句来引发异常。在此情况下,控制权将无条件转到处理异常的部分代码Try...Catch...Finally241)try语句C#使用try语句来捕捉和处理程序执行过程中产生的异常。try语句提供一种在执行一个语句块时能够抓住异常的机制.格式:try{程序代码块;//我们应该把有可能发生异常的该代码放置在try中.}catch(Exceptionex){异常处理代码块;//捕捉到异常后的处理方法放置到catch中。}finally{无论是否发生异常,均要执行的代码块;}25举例:inti=0;try{i=Convert.ToInt32(textBox1.Text);}catch(FormatExceptionex)//字符格式异常{MessageBox.Show(ex.Message);}catch(Exceptionex)//处理系统中的任何一种异常{MessageBox.Show(ex.Message);}finally{MessageBox.Show(测试完毕);}26try语句说明try语句通常包含try子句、catch子句和finally子句,总共有三种可能的try语句形式:try–catch:后面跟有一个或多个catch语句块的try语句块。try–finally:后面跟有一个finally的try语句块。try–catch–finally:后面既跟有catch又跟有finally的try语句块。try子句包含可能发生异常的语句块,catch子句包含用来处理或者响应异常的语句块。catch子句执行后,程序将继续执行。若要处理异常后中止程序,则须用return、throw或exit.finally子句,无论try子句是否引发异常,该子句包含的语句块总被执行,因此,finally子句可以用来进行一些必要的清除操作,如释放对象占用的资源等。272)throw语句Throw:人工抛出异常Throw格式1:throw表达式;说明:带有表达式的throw语句抛出的异常是在计算这个表达式时产生的表达式须是System.Exception类型值,或从Sytem.Exception继承而来的类类型。如果计算表达式的结果是null,一个NullReferenceException异常将会被抛出。格式2:throw;不带表达式的throw语句只能用在一个catch语句块中,在一个catch块中,可以用不含表达式的throw语句将该catch块捕捉到的异常再次抛出,对于异常变量的分配不会改变再次抛出的异常。异常传播:当一个异常被抛出以后,程序将控制权转移给try语句中第一个能够处理该异常的catch子句。这个从异常抛出到控制转移给合适的异常处理语句的过程就叫做异常传播。28throw举例try{if(textBox1.Text==){thrownewException(不能为空);}}catch(Exceptionex){MessageBox.Show(ex.Message);}295.自定义异常类创建1.创建一个ApplicationException子类,空值异常publicclassMyException:System.ApplicationException{//重写构造函数publicMyException():base(){}//Message属性的重载publicoverridestringMessage{get{return不允许为空值;}}}30引发自定义异常2.在程序方法中可以通过throw语句引发异常if(textBox1.Text==){thrownewMyException();}31示例-建立自定义异常usingSystem;publicclassEmailCheckException:ApplicationException{publicstring_mes;//重写构造函数publicEmailCheckException():base(){_mes=null;}publicEmailCheckException(stringmessage):base(){_mes=message.ToString();}publicEmailCheckException(stringmessage,ExceptionmyNew):base(message,myNew){_mes=message.ToString();}//Message属性的重载publicoverridestringMessage{get{return格式错误;}}}32示例-throw引发异常privateboolInfoSave(stringemail){string[]subStrings=email.Split('@');//如果输入的Email不是被“@”字符分割成两段,则抛出Email错误异常if(subStrings.Length!=2){thrownewEmailCheckException();}else{intindex=subStrings[1].IndexOf(.);//查找被“@”字符分成的两段的后一段中“.”字符的位置,没有“.”//或者“.”字符是第一个字符,则抛出EmailErrorException异常if(index=0){thrownewEmailCheckException();}//如果“.”字符是最后一个字符,抛出EmailErrorException异常if(subStrings[1][subStrings[1].Length-1]=='.'){thrownewEmailCheckException();}}returntrue;}33示例-Catch自定义异常privatevoidSubmit_Click(objectsender,System.EventArgse){if(textName.Text.Length==0&&textEmail.Text.Length==0){MessageBox.Show(请填写正确的信息!,填写提示,MessageBoxButtons.OK,MessageBoxIcon.Information);return;}try{InfoSave(textEmail.Text);}catch(EmailCheckExceptionerr){MessageBox.Show(err.Message,邮件格式错误,System.Windows.Forms.MessageBoxButtons.OK,MessageBoxIcon.Information);return;}MessageBox.Show(“发送成功。,成功,MessageBoxButtons.OK,MessageBoxIcon.Information);}34总结调试是搜寻和消除应用程序中的错误的过程语法错误表示编译器无法理解代码调试模式可用来重复编译和排除应