Presentation is loading. Please wait.

Presentation is loading. Please wait.

第5章 异常处理 王德俊 上海交通大学继续教育学院.

Similar presentations


Presentation on theme: "第5章 异常处理 王德俊 上海交通大学继续教育学院."— Presentation transcript:

1 第5章 异常处理 王德俊 上海交通大学继续教育学院

2 第5章 异常处理 5.1 异常处理模型 5.2 .NET的Exception层次、属性 5.3 异常的抛出及用户自定义异常

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 (Exception e) //捕获异常 Console.WriteLine("产生异常:{0}", e.Message); //处理异常 Console.ReadKey(); 试图将“123ab4”转换为整数时产生了异常 产生该异常时自动转向执行该语句

4 5.1 异常处理模型 5.1.1 异常的概念 5.1.2 try-catch结构 5.1.3 try-catch-catch结构
5.1 异常处理模型 5.1.1 异常的概念 5.1.2 try-catch结构 5.1.3 try-catch-catch结构 5.1.4 try-catch-finally结构

5 所谓异常,它是指程序在运行过程(而非编译过程)中产生 的错误 编译过程中的错误可以通过代码调试来避免,异常一般是不 能避免的(只能是减少)
5.1异常处理模型 5.1.1 异常的概念 所谓异常,它是指程序在运行过程(而非编译过程)中产生 的错误 编译过程中的错误可以通过代码调试来避免,异常一般是不 能避免的(只能是减少) 异常处理统一了错误处理机制,使程序具有较强的错误处理 能力,使得程序更加健壮和稳定;有助于从事大型项目开发 的程序员理解其他程序员编写的错误处理代码。

6 try-catch结构如下: 5.1.2 try-catch结构 try { //可能产生异常的代码 } catch [(异常类 对象名)]
5.1异常处理模型 5.1.2 try-catch结构 try-catch结构如下: try { //可能产生异常的代码 } catch [(异常类 对象名)] //处理异常的代码

7 try-catch结构 一旦在try块中有某一条语句执行时产生异常,程序立即转向 执行catch块中的代码,而不会再执行该语句后面的其他语句。 如果try块中的语句都不产生异常,那么就不会有任何的catch块被执 行。 “(异常类 对象名)”部分可以省略。如果省略,则不管在try块 中产生什么异常,程序都会转向执行catch块中的代码,而我 们将无法获取此异常的任何信息。 “异常类”用于决定要捕获的异常的类型,不同的异常类能 捕获和处理不同的异常 常用的异常类如表5.1所示

8 【例5.1】 内存溢出异常的捕获和处理。 在申请较大块的存储空间时可能出现失败,这时会产生一个 内存溢出的异常(OutOfMemoryException)。 在下面的OutOfMemExc_Exa程序中,申请了20000*30000个 存储单元,结果超出了笔者机器的可用内存空间,因而产生 了内存溢出异常。

9 static void Main(string[] args)
{ try int[,] a = new int[20000, 30000]; //申请存储空间 } catch (OutOfMemoryException e) //异常捕获与处理 Console.WriteLine("产生异常:{0}", e.Message); Console.ReadKey();

10 当出现多个不同的异常时,需要用到带多个catch块的try-catch-catch结构。
5.1 异常处理模型 5.1.3 try-catch-catch结构 当出现多个不同的异常时,需要用到带多个catch块的try-catch-catch结构。 【例5.2】 多个异常的捕获和处理。 程序中,try结构包含的两条语句在执行时都会产生异常,分别为 DivideByZeroException异常和OutOfMemoryException异常。这两个异常分 别由两个catch结构来捕获和处理。

11 static void Main(string[] args)
{ int n, m; n = 30000; m = 30000; try n = 1 / (n - m); int[,] a = new int[n, n]; } catch (OutOfMemoryException e1) Console.WriteLine("内存溢出异常:{0}", e1.Message); catch (DivideByZeroException e2) Console.WriteLine("零除异常:{0}", e2.Message); 由于DivideByZeroException异常先发生,故转向执行第二个catch块,第一个catch块没有被执行。

12 5.1.3 try-catch-catch结构 多个catch块的顺序问题:
5.1异常处理模型 5.1.3 try-catch-catch结构 多个catch块的顺序问题: catch后面的异常类之间没有继承关系(如DivideByZeroException和 System.OutOfMemoryException),这时catch块的位置不分先后。 catch后面的异常类之间存在继承关系(如DivideByZeroException类 继承了ArithmeticException类、所有异常类都继承了Exception类), 这时派生类所在的catch块必须放在基类所在的catch块的前面。即作 用范围小的catch块放在前面,作用范围大的块放在后面。

13 多个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);

14 多个catch块的顺序问题 由于Exception类是所有其他异常类的基类,因此Exception类 所在的catch块必须是最后面的catch块。 显然,如果不想具体区分是哪一种类型的异常,可以利用 Exception类“笼统”地捕获所有的异常。

15 在出现异常时程序并不是按照既定的顺序执行,而是跳转执 行,可能跳过一些必要的代码。
5.1异常处理模型 5.1.4 try-catch-finally结构 在出现异常时程序并不是按照既定的顺序执行,而是跳转执 行,可能跳过一些必要的代码。 为维持系统的有效性和稳定性,必须保证某些代码必须执行, 完成必要的清理工作(如关闭文件、释放内存等),由带 finally的try-catch-finally结构来实现。

16 不管在try块中是否产生异常, finally块中的代码都会被执行。
5.1异常处理模型 5.1.4 try-catch-finally结构 try-catch-finally结构的格式如下: try { //可能产生异常的代码 } catch [(异常类 对象名)] //处理异常的代码 finally //完成清理工作的代码 不管在try块中是否产生异常, finally块中的代码都会被执行。 不管catch块是否被执行, finally块都会被执行。 即使是在catch块中遇到return 语句,也会执行finally块。

17 Console.WriteLine("产生异常:{0}", e.Message); return;
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语句,且执行该return语句时也会立即结束当前函数的执行,但在结束之前仍然会执行finally块。 执行catch块 遇到return语句 该语句不被执行 该语句被执行 该语句不被执行,因在catch块中遇到return语句

18 本讲小结 为什么需要异常 异常处理的三种结构 异常处理的顺序问题


Download ppt "第5章 异常处理 王德俊 上海交通大学继续教育学院."

Similar presentations


Ads by Google