《PPT 讲稿文字规范.ppt》由会员分享,可在线阅读,更多相关《PPT 讲稿文字规范.ppt(18页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、第5章 异常处理,王德俊 上海交通大学继续教育学院,第5章 异常处理,5.1 异常处理模型5.2 .NET的Exception层次、属性5.3 异常的抛出及用户自定义异常,一个产生异常的简单程序,创建控制台应用程序ExceptionPro,该程序能够捕获产生的异常,并进行相应的处理: static void Main(string args) int n, m; string s = Console.ReadLine(); n = 0; try m = Convert.ToInt16(s); /产生异常的语句 Console.WriteLine(m = 0, m); catch (Except
2、ion e) /捕获异常 Console.WriteLine(产生异常:0, e.Message); /处理异常 Console.ReadKey(); ,试图将“123ab4”转换为整数时产生了异常,产生该异常时自动转向执行该语句,5.1 异常处理模型,5.1.1 异常的概念5.1.2 try-catch结构5.1.3 try-catch-catch结构5.1.4 try-catch-finally结构,所谓异常,它是指程序在运行过程(而非编译过程)中产生的错误编译过程中的错误可以通过代码调试来避免,异常一般是不能避免的(只能是减少)异常处理统一了错误处理机制,使程序具有较强的错误处理能力,使
3、得程序更加健壮和稳定;有助于从事大型项目开发的程序员理解其他程序员编写的错误处理代码。,5.1异常处理模型,5.1.1 异常的概念,try-catch结构如下:try /可能产生异常的代码catch (异常类 对象名) /处理异常的代码,5.1异常处理模型,5.1.2 try-catch结构,try-catch结构,一旦在try块中有某一条语句执行时产生异常,程序立即转向执行catch块中的代码,而不会再执行该语句后面的其他语句。如果try块中的语句都不产生异常,那么就不会有任何的catch块被执行。“(异常类 对象名)”部分可以省略。如果省略,则不管在try块中产生什么异常,程序都会转向执行
4、catch块中的代码,而我们将无法获取此异常的任何信息。“异常类”用于决定要捕获的异常的类型,不同的异常类能捕获和处理不同的异常常用的异常类如表5.1所示,【例5.1】 内存溢出异常的捕获和处理。 在申请较大块的存储空间时可能出现失败,这时会产生一个内存溢出的异常(OutOfMemoryException)。 在下面的OutOfMemExc_Exa程序中,申请了20000*30000个存储单元,结果超出了笔者机器的可用内存空间,因而产生了内存溢出异常。,static void Main(string args) try int, a = new int20000, 30000; /申请存储空间
5、 catch (OutOfMemoryException e) /异常捕获与处理 Console.WriteLine(产生异常:0, e.Message); Console.ReadKey(); ,当出现多个不同的异常时,需要用到带多个catch块的try-catch-catch结构。,5.1 异常处理模型,5.1.3 try-catch-catch结构,【例5.2】 多个异常的捕获和处理。程序中,try结构包含的两条语句在执行时都会产生异常,分别为DivideByZeroException异常和OutOfMemoryException异常。这两个异常分别由两个catch结构来捕获和处理。,s
6、tatic void Main(string args) int n, m; n = 30000; m = 30000; try n = 1 / (n - m); int, a = new intn, n; catch (OutOfMemoryException e1) Console.WriteLine(内存溢出异常:0, e1.Message); catch (DivideByZeroException e2) Console.WriteLine(零除异常:0, e2.Message); ,由于DivideByZeroException异常先发生,故转向执行第二个catch块,第一个cat
7、ch块没有被执行。,多个catch块的顺序问题:catch后面的异常类之间没有继承关系(如DivideByZeroException和System.OutOfMemoryException),这时catch块的位置不分先后。catch后面的异常类之间存在继承关系(如DivideByZeroException类继承了ArithmeticException类、所有异常类都继承了Exception类),这时派生类所在的catch块必须放在基类所在的catch块的前面。即作用范围小的catch块放在前面,作用范围大的块放在后面。,5.1异常处理模型,5.1.3 try-catch-catch结构,多个
8、catch块的顺序问题,例如,下面代码中的两个catch块的顺序是不能颠倒的,否则无法通过编译检查:int n = 1, m = 1;try n = 1 / (n - m);catch (DivideByZeroException e) /派生类所在的catch块(作用范围小) Console.WriteLine(产生异常:0, e.Message);catch (ArithmeticException ee) /基类所在catch块(作用范围大) Console.WriteLine(产生异常:0, ee.Message);,多个catch块的顺序问题,由于Exception类是所有其他异常类
9、的基类,因此Exception类所在的catch块必须是最后面的catch块。显然,如果不想具体区分是哪一种类型的异常,可以利用Exception类“笼统”地捕获所有的异常。,在出现异常时程序并不是按照既定的顺序执行,而是跳转执行,可能跳过一些必要的代码。为维持系统的有效性和稳定性,必须保证某些代码必须执行,完成必要的清理工作(如关闭文件、释放内存等),由带finally的try-catch-finally结构来实现。,5.1异常处理模型,5.1.4 try-catch-finally结构,try-catch-finally结构的格式如下:try /可能产生异常的代码catch (异常类 对象
10、名) /处理异常的代码finally /完成清理工作的代码,5.1异常处理模型,5.1.4 try-catch-finally结构,不管在try块中是否产生异常,finally块中的代码都会被执行。不管catch块是否被执行,finally块都会被执行。即使是在catch块中遇到return语句,也会执行finally块。,int n = 1, m = 1;try n = 1 / (n - m);catch (Exception e) Console.WriteLine(产生异常:0, e.Message); return; Console.WriteLine(紧跟在return后面.);finally Console.WriteLine(finally块.);Console.WriteLine(try-catch-finally结构后面的部分.);,产生零除异常,执行catch块,遇到return语句,该语句不被执行,该语句被执行,该语句不被执行,因在catch块中遇到return语句,可以看到,虽然catch块包含了一条return语句,且执行该return语句时也会立即结束当前函数的执行,但在结束之前仍然会执行finally块。,本讲小结,为什么需要异常异常处理的三种结构异常处理的顺序问题,