Presentation is loading. Please wait.

Presentation is loading. Please wait.

$14 异常处理. $14 异常处理 异常处理 错误和异常 C#中异常处理结构 异常的层次结构 使用异常的原则和技巧.

Similar presentations


Presentation on theme: "$14 异常处理. $14 异常处理 异常处理 错误和异常 C#中异常处理结构 异常的层次结构 使用异常的原则和技巧."— Presentation transcript:

1

2 $14 异常处理

3 异常处理 错误和异常 C#中异常处理结构 异常的层次结构 使用异常的原则和技巧

4 错误和异常 错误 异常 语法错误 – 编译器检查处理 逻辑错误 – 通过测试方法查找,但无法保证能找出程序中的所有错误
结果 – 程序不能正确运行 原因 代码本身问题 外部环境问题

5 异常处理办法 代码检查(if-else) 异常处理(try-catch) //程序清单P14_3.cs: using System;
namespace P14_2 { class AvoidExceptionSample static void Main() Console.Write("请输入整数x:"); int x = int.Parse(Console.ReadLine()); if (x == 2) Console.WriteLine("x的值不能为2"); else Console.Write("请输入整数y:"); int y = int.Parse(Console.ReadLine()); if (y == x) Console.WriteLine("x和y的值不能相等"); if (y == 5) Console.WriteLine("y的值不能为5"); int result = 30 / (x - 2) / (y - x) / (5 - y); Console.WriteLine("30 / (x-2) / (y-x) / (5-y) = {0}", result); } } } } }} 异常处理(try-catch) //程序清单P14_3.cs: using System; namespace P14_3 { class CatchExceptionSample static void Main() try Console.Write("请输入整数x:"); int x = int.Parse(Console.ReadLine()); Console.Write("请输入整数y:"); int y = int.Parse(Console.ReadLine()); int result = 30 / (x - 2) / (y - x) / (5 - y); Console.WriteLine("30 / (x-2) / (y-x) / (5-y) = {0}", result); } catch Console.WriteLine("程序发生异常,请检查您的输入是否有误。"); } } }}

6 异常处理结构 try-catch 正常情况下try代码段中语句依次执行,而catch代码段不会被执行;一旦出现异常就从try语句转到catch语句,并在catch代码段中进行异常处理。 catch语句还可以捕获指定的异常。可以在catch语句后加上一对括号,在括号中指定希望捕获的异常类型。这时,只有指定异常发生时,catch语句才获得程序的控制权。如果发生其他异常,该catch语句不作处理。

7 try-catch示例 try { Console.Write("请输入整数x:");
int x = int.Parse(Console.ReadLine()); Console.Write("请输入整数y:"); int y = int.Parse(Console.ReadLine()); int result = 30 / (x - 2) / (y - x) / (5 - y); Console.WriteLine("30 / (x-2) / (y-x) / (5-y) = {0}", result); } catch (FormatException) Console.WriteLine("您的输入的格式不正确!"); catch (DivideByZeroException) Console.WriteLine("分母不能为零。"); catch (Exception) Console.WriteLine("程序运行过程中发生异常。");

8 异常处理结构(续) try-catch-finally
try-catch-finally语句是在try-catch语句后加上finally代码构成的,其中同样可以使用多个catch语句,但finally语句一定要在所有catch语句的后面,而且只能出现一次。在发生异常的情况下,try-catch-finally对异常的处理方式与try-catch语句完全相同,也是通过不同的catch语句来捕获不同的异常。但不论程序在执行过程中是否发生异常,finally语句中的代码总是被执行。因此,可以将程序必须执行的工作放在finally代码段中执行,如释放资源、关闭文件等,以保证这些工作在程序正常运行和发生异常的情况下都能完成。

9 try-catch-finally示例 try { Console.Write("请输入操作数: ");
double x = double.Parse(Console.ReadLine()); Console.WriteLine("请选择函数:"); Console.WriteLine("平方根(0) e(1) ln(2) Sin(3) Cos(4) Tan(5) CTan(6) ArcSin(7) ArcCos(8) ArcTan(9) ArcCTan(10)"); int iType = int.Parse(Console.ReadLine()); OneFunction func = PrimaryFunction.GetOneFunction(iType); Console.WriteLine("函数值: {0}", func(x)); } catch (FormatException) Console.WriteLine("您的输入的格式不正确!"); catch (ArithmeticException) Console.WriteLine("不正确的数学运算!"); finally Console.WriteLine("继续进行计算(Y/N)?"); key = Console.ReadKey(); if (key.KeyChar == 'N' || key.KeyChar == 'n') bContinue = false;

10 异常处理结构(续) try-finally
try-finally语句是在try代码段后面紧跟finally代码段。由于没有catch语句,也就不对异常进行处理。因此,如果没有发生异常,try-finally语句将正常方式执行;如果在try代码段的执行过程中引发了异常,该异常将在执行完finally代码段之后被抛出。 虽然该语句也是异常处理结构中的一种,但它实际上并不能处理异常。如果发生异常,这只是能句利用finally代码段进行一些收尾工作,而不能保证程序在异常发生之后继续正常运行。

11 异常处理结构(续) throw: 强制抛出异常
主动引发一个异常,如果该异常不被捕获将导致程序中止。throw语句的使用格式是在关键字throw之后跟一个异常类型的对象,当程序执行到throw语句时就引发相应的异常,之后的语句不会被执行。throw语句的主要用途是对发生的异常进行描述。

12 throw示例 //程序清单P14_7.cs: using System; namespace P14_7 {
class ThrowSample static void Main() ConsoleRW c1 = new ConsoleRW(); c1.Validate("2008", 3); } public class ConsoleRW public string Read(string sPrompt) Console.WriteLine("请输入{0}:", sPrompt); return Console.ReadLine(); public void Write(string sPrompt, string sContent) { Console.WriteLine("{0}: {1} ", sPrompt, sContent); } public void Validate(string sPwd, int iCount) int i = 0; while (Read("密码") != sPwd) if (++i > iCount) throw (new Exception("密码输入错误次数超过限制!")); Console.Write("密码错误!"); Console.WriteLine("通过验证...");

13 异常的层次结构 异常传播 1如果当前的异常处理结构中包含能够处理该异常的catch语句,那么程序控制权就转移给第一个这样的catch语句,异常传播结束。 2如果没有找到能够处理该异常的catch语句,则程序通过当前的异常结构(如果存在finally代码段则执行它) 3如果程序到达更外层的一个异常处理结构,则转到第1步。 4如果异常在当前的成员方法没有得到处理,则当前方法的执行被中止;若当前方法是程序所在进程或线程的主方法,则整个程序结束运行;否则,程序控制权转移给调用当前方法的代码,重复第1步。 示例见P331

14 异常的层次结构 Exception类 Exception类是.NET类库中所有其他异常类的基类,是对所有异常的抽象。 属性名 类型 含义
访问函数 Message string 描述当前异常对象的字符串 get Source 引发当前异常对象的程序或对象名称 get、set Data IDictionary 关于当前异常对象的附加信息集合 HelpLink 指向此异常帮助文件的链接 get 、set InnerException Exception 表示引发当前异常的内部异常对象 StackTrace 引发异常时调用堆栈上的帧的字符串表示 TargetSite MethodBase 当前异常对象引发时所在的方法 Exception类的公有属性

15 异常的层次结构-常见异常类型 SystemException类和ApplicationException 与参数有关的异常类
ArgumentException – 参数无效 FormatException – 参数格式错误 与成员访问有关的异常类 MemberAccessException – 没有足够的权限访问 FieldAccessException – 访问字段成员失败引发 MethodAccessException – 访问方法成员失败引发 MissingMemberException – 访问成员不存在引发

16 异常的层次结构-常见异常类型 与数组有关的异常 与内存和磁盘操作有关的异常 IndexOutOfRengeException
ArrayTypeMismatchException RankException 与内存和磁盘操作有关的异常 OutOfMemoryException NullReferenceException ArgumentNullException IOExcepton DirectoryNotFoundException – 没找到指定目录引发 FileNotFoundException – 没找到指定文件引发 EndOfStreamException – 已经到达流的末尾引发 FileLoadException – 没能加载文件引发 PathTooLongException – 文件或目录的路径超出规定长度引发

17 异常的层次结构-常见异常类型 与算术运算有关的异常 其他异常 ArithmeticException
DivideByZeroException – 试图除以0引发 NotFiniteNumberException – 浮点数运算出现正负无穷或非数值时引发 OverflowException – 运算溢出时引发 其他异常 InvalidCastException – 类型转换失败引发 InvalidOperationException – 对对象的无效操作引发 MulticastNotSuportedException – 合并两个不匹配的委托对象引发 StackOverflowException- 操作系统堆栈溢出引发

18 异常层次结构图

19 异常处理的原则和技巧 原则和技巧 使用“良性”异常 简化异常信息 限定异常范围 精确捕获异常 限制在方法中引发异常 在高层次处理异常
记录异常


Download ppt "$14 异常处理. $14 异常处理 异常处理 错误和异常 C#中异常处理结构 异常的层次结构 使用异常的原则和技巧."

Similar presentations


Ads by Google