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