资源预览内容
第1页 / 共205页
第2页 / 共205页
第3页 / 共205页
第4页 / 共205页
第5页 / 共205页
第6页 / 共205页
第7页 / 共205页
第8页 / 共205页
第9页 / 共205页
第10页 / 共205页
亲,该文档总共205页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
Visual C#.NET程序设计与应 用开发(中)第6章 程序调试与异常处理 第7章 Visual C#.NET面向对 象编程技术 第8章 常见窗体控件的使用 第9章 使用ADO.NET访问数据 库 第10章 GDI+绘图第6章 程序调试与异常处理主要内容l程序调试方法的使用l异常处理的方法l如何自行抛出异常调试的必要性l俗话说得好:“人无完人”。程序也是如此,再有经验 的程序员,写代码的时候再小心,也会出错。因为人 不是机器,肯定会有考虑不周全的时候或者粗心,这 样就会造成错误。Visual C#.NET 2005环境中提供了 基本的语法检查以及错误识别,小错误稍微有点程序 经验的人员通过运行时的错误提示就可以轻松化解。l但是,也有的时候我们的程序本身看不出来有什么错 误,运行时也会能得到结果,可是结果不是我们预期 的,这时我们就需要通过跟踪代码,通过窗口输出协 助以及设置断点等方式,进行查找。这种错误叫逻辑 错误,是最难查出的错误。 6.1 程序调试的介绍以及调试方 法的使用 l程序在编写的过程中错误主要类型:l语法错误 语法错误常见的是发生在初学者身上,这种错误在编译阶段 程序可以自动跳到错误之处,很容易修改。l运行时错误 运行时错误是用户在执行应用程序时,因为输入类型不符或 者是被除数为0或者数组越界造成的,这个错误会造成程序的 中断,可以使用 try-catch-finally语句解决。l逻辑错误 逻辑错误是最困难的错误,尤其在大型程序中最为明显。程 序在执行过程中不提示错误信息,也会有运行结果,但是结 果不符合逻辑,或者是跟我们预期的不一样。调试演示l例 6.1 求整数X的最大值,使得X的阶乘小于200。 程序代码:lusing System;lusing System.Collections.Generic;lusing System.Text;lnamespace Example1of6ll class JieChengl l static void Main(string args)l l int result =1;l int n = 1;l while (true)l l result *= n;l if (result = 200)l l result = result / n;l Console.WriteLine(“1*2*0=1200“,n,result);l break;l l n = n + 1;l l Console.ReadLine();l l l结果显示错误发现l上面的程序运行正常,也产生了结果, 但是我们发现1*2*3*4*5*6并不等于120 ,而是等于720,这就说明我们的程序 存在逻辑错误,下面我们一起来探讨一 下如何通过调试来查询错误。 断点设置l在代码中设置3个断点l 错误分析过程l通过自动窗口我们发现,在上面的例子 中,n=5时result的值就已经是120了, 所以我们可以在代码result = result / n; 后面添加代码n = n - 1;就可以了。 6.2 异常处理 lC#中的异常处理由4个关键字来管理:Try、Catch、 Throw和Finally。它们构成了一个相关子系统,在这 个子系统中,一个关键字的使用隐含地使用另一个关 键字。本节中将详细地分析每个关键字,但是开始时 ,大概了解每个关键字在异常处理中的作用是有作用 的,也是有帮助的。try语句块主要包含我们要监视的 是否产生异常的程序语句,如果try语句块内的语句发 生异常,那么就要抛出(Throw)异常,然后使用 Catch语句捕捉此异常,并以合理的方式处理它。C# 运行时系统会自动抛出系统产生的异常。要手动抛出 异常,则使用关键字Throw。从try模块退出时绝对需 要执行的代码放置在Finally语句中。 异常处理的注意事项 lC#异常处理中应该注意以下事项:l抛出异常时,需要提供一些有价值的文本信息;l只有在真正需要异常处理时才可以使用抛出异常。也就是说当一个 正常的返回值 l不满足条件时才能使用;l当传递给方法或属性的参数有错误时,使用一个 ArgumentException异常;l当操作无意识地与对象当前状态不相符时,要抛出一个 InvalidOperationExceptionl异常;l要引发合适的异常;l要使用链接的异常,它们允许用户跟踪异常树结构;l不要在流程的正常控制中使用异常处理;l不要用异常来控制程序的运行走向;l不要在函数中引发NullReferenceException或 IndexRangeExcepption异常。 异常处理中使用的语句 l使用Try和Catch捕获异常 l使用Try语句和Catch语句,可以使程序在发生异常时不仅不会提示给用户比较讨厌的 异常信息还会继续执行程序。lTry语句包括可能产生异常的部分,而Catch语句可以处理一个存在的异常。 l使用Try和Finally清除异常 l使用Try和Finally语句,可以清除异常。Finally代码块可以用于清除 Try代码块中分配的任何资源,以及运行任何即使在发生异常时也必 须执行的代码。Catch语句用于处理语句块中出现的异常,而Finally 语句用于保证代码语句块的执行。控制总是传递给Finally语句块, 而与Try语句块的退出方式无关。也就是说,Finally代码块总是会被 执行到。Finally关键字既可以与Try关键字单独配对使用,也可以与 TryCatch语句共同使用。 l使用Try、Catch和Finally处理所有的异常 l应用程序最有可能的途径是合并前面两种错误处理技术:捕获错误 、清除并继续执行应用程序。所有你要做的是在出错处理代码中使 用Try-Catch-Finally语句。 使用Try和Catch捕获异常的一个 小例子l例 :两个数组的元素相除,输出结果,并且捕捉异常。 程序代码:lusing System;lnamespace Example2of6ll class Programl l static void Main(string args)l l int M = 4, 8, 16, 32, 64,128 ;l int N = 1, 0, 2, 4, 0, 2 ;l for (int i = 0; i M.Length; i+)l l tryl l Console.WriteLine(Mi + “/“ + Ni + “ is “ + Mi/ Ni);l l catch(DivideByZeroException)l l /catch the exceptionl Console.WriteLine(“cant divide by 0“);l l l Console.ReadLine();l l l程序运行结果 程序代码解析l上面的例子体现了异常处理的优点,它 允许程序响应错误并且继续运行,当出 现了除数为0的时候,就会产生 DivideByZeroException异常。此异常因 为我们进行了捕捉,所以并不会终止程 序,而是会报告错误信息而后继续执行 。 使用Try-Finally语句清除异常 示例 l例 使用Try-Finally语句清除异常示例。 程序代码:lusing System;lusing System.Collections.Generic;lusing System.Text;lnamespace Example3of6ll class Programl l static void Main(string args)l l Console.WriteLine(“验证finally语句与goto语句的先后顺序:“);l tryl l Console.WriteLine(“try“);l goto A;l l finally l l Console.WriteLine(“finally“);l l A:l Console.WriteLine(“A“);l Console.ReadLine();l l l程序运行结果 程序代码解析l由上面程序的运行结果看,Finally语句 块总是被执行,所以我们可以利用Try- Finally语句来清除异常。如果在执行 Finally语句块时抛出了一个异常,那么 这个异常会被传播到下一轮Try语句中, 如果在异常传播的过程中友发生了另一 个异常,那么这个异常将被丢失。 使用Try-Catch-Finally异常处理 语句 l 例 6.4 使用Try-Catch-Finally异常处理语句计算函数值。程序代码:lusing System;lusing System.Collections.Generic;lusing System.Text;lnamespace Example4of6ll class Programl l static void Main(string args)l l double x, y, z=0;l Console.WriteLine(“请输入x的值:“);l x=double.Parse(Console.ReadLine();l Console.WriteLine(“请输入y的值:“);l y = double.Parse(Console.ReadLine();l tryl l if (x * x - y * y) 0)l throw new ArithmeticException();l elsel z = Math.Sqrt(x * x - y * y);l l catch(ArithmeticException e)l l Console.WriteLine(“catch“+e.ToStri
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号