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

Slides:



Advertisements
Similar presentations
软件编程基础 一、程序的编辑 Java 源程序是以 Java 为后缀的简单的文本文件,可以用各种 Java 集成开发环境中的源代码编辑器来编写,也可以用其他文 本编辑工具,如 Windows 中的记事本或 DOS 中的 EDIT 软件等。 利用文字编辑器编写下列程序 public class Hello.
Advertisements

第四章 类、对象和接口.
第三讲 面向对象(上).
项目6 通用堆栈.
Demo-dataSource與DropDownList
歷史建築清水國小宿舍群修復工程 施工說明會
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
四資二甲 第三週作業 物件導向程式設計.
C#程序设计案例教程 第3章 程 序 结 构.
算法设计与分析 Algorithm Design and Analysis
102學年度預算編製說明會 主辦單位:會計室 102/02/22.
C#程序设计 10软件1、2班 王槐彬 计算机工程学院.
第二章 JAVA语言基础.
Ch07 介面與多重繼承 物件導向程式設計(II).
第三章 控制结构.
C# 程式設計 第一部分 第1-4章 C# 程式設計 - 南華大學資管系.
第9课 北美大陆上的新体制 导入新课 新课教学 课堂小结 知识结构 巩固练习
程式設計實作.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
.NET 程式設計入門(使用 C#) 講師:鄧智鴻.
第四章 在 C# 中实现 OOP 概念.
例外處理(Exception Handling)
Java基础 JavaSE异常.
南华大学计算机学院 软件工程系 QQ讨论群:
程序與函數的類別方法 目的:模組化程式設計 方法:由上而下設計 注意事項:(1)獨立性 (2)結合問題 (3)子問題間的溝通.
第十三章 文件和注册表操作.
C#程序设计 c# programming 多线程 C#程序设计课程组.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
C#程序设计 c# programming 网络编程 C#程序设计课程组.
西南科技大学网络教育系列课程 高级语程序设计(Java) 第五章 继承、接口与范型.
程式設計實作.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
Java语言程序设计 第五部分 Java异常处理.
第9章 多线程 王德俊 上海交通大学继续教育学院.
第4章 数组和集合 4.1 一维数组 4.2 二维数组 4.3 Array类 4.4 交错数组 4.5 ArrayList类
王豐緒 銘傳大學資訊工程學系 問題:JAVA 物件檔輸出入.
第三章 流程控制與例外處理 資訊教育研究室 製作 注意:本投影片僅供上課使用,非經同意,請勿散播或轉載。
C#面向对象程序设计 $7 继承和多态性.
例外處理與 物件序列化(Exception Handling and Serialization of Objects)
檔案讀寫與例外處理 (File IO and Exception Handling)
9.1 程式偵錯 9.2 捕捉例外 9.3 自行拋出例外 9.4 自定例外類別 9.5 多執行緒
第9讲 Java的继承与多态(一) 类的继承 子类的创建 方法覆盖.
第 十二 章 C# 中的文件处理.
异常及处理.
C/C++/Java 哪些值不是头等程序对象
C#程序设计基础 第二章 数据类型.
第六章 属性、索引器、委托和事件.
* 單元:電腦與問題解決 主題:Java物件導向程式設計-類別與物件 台南縣國立善化高中 蕭嘉民 老師
第三章 C# 基础知识.
辅导课程八.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
C#程序设计基础 $3 成员、变量和常量.
第7章 异常处理.
第二章 Java基本语法 讲师:复凡.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
第二章 Java语法基础.
第二章 Java基本语法 讲师:复凡.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
龍老師我不會Debug QQ.
第二章 Java基本语法 讲师:复凡.
Java程序设计 第17章 异常和断言.
所得稅法第14條、第126條修正條文 薪資所得計算方式二擇一 定額減除 特定費用減除 維持現行薪資所得特別扣除額20萬元減除方式
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
第4讲 类和对象、异常处理 ggao.
判斷(選擇性敘述) if if else else if 條件運算子.
第二章 Java基础语法 北京传智播客教育
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
第二章 Java基本语法 讲师:复凡.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
Presentation transcript:

第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 (Exception 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 异常处理模型 5.1.1 异常的概念 5.1.2 try-catch结构 5.1.3 try-catch-catch结构 5.1.4 try-catch-finally结构

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

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

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

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

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

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

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块没有被执行。

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块放在前面,作用范围大的块放在后面。

多个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类是所有其他异常类的基类,因此Exception类 所在的catch块必须是最后面的catch块。 显然,如果不想具体区分是哪一种类型的异常,可以利用 Exception类“笼统”地捕获所有的异常。

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

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

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语句

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