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

Slides:



Advertisements
Similar presentations
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
Advertisements

C#程序设计案例教程 第3章 程 序 结 构.
Exception子类的继承关系 Exception ClassNotFoundException
Oracle数据库 Oracle 子程序.
C#程序设计 10软件1、2班 王槐彬 计算机工程学院.
第二章 JAVA语言基础.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
C# 程式設計 第一部分 第1-4章 C# 程式設計 - 南華大學資管系.
第5章 异常处理 王德俊 上海交通大学继续教育学院.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
C#程序设计基础 $5 流程控制.
C#程序设计 c# programming 泛型 C#程序设计课程组.
Signutil.
.NET 程式設計入門(使用 C#) 講師:鄧智鴻.
第二章 C# 基础知识.
第四章 在 C# 中实现 OOP 概念.
Hadoop I/O By ShiChaojie.
Java基础 JavaSE异常.
第七章 异常.
南华大学计算机学院 软件工程系 QQ讨论群:
C++ with Managed Extensions
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
C#程序设计基础 $3 成员、变量和常量.
Java语言程序设计 第五部分 Java异常处理.
第6章 异常的捕获及处理 6.1 异常简介 6.2 异常类的继承结构 6.3 异常处理机制 6.4 异常处理 6.5 本章小结.
第9章 多线程 王德俊 上海交通大学继续教育学院.
第三章 流程控制與例外處理 資訊教育研究室 製作 注意:本投影片僅供上課使用,非經同意,請勿散播或轉載。
辅导课程六.
C#面向对象程序设计 $7 继承和多态性.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第五讲 四则运算计算器(一) 精品教程《C#程序设计与应用(第2版)清华大学出版社 谭恒松 主编
第5章 异常处理 王德俊 上海交通大学继续教育学院.
例外處理與 物件序列化(Exception Handling and Serialization of Objects)
檔案讀寫與例外處理 (File IO and Exception Handling)
9.1 程式偵錯 9.2 捕捉例外 9.3 自行拋出例外 9.4 自定例外類別 9.5 多執行緒
异常及处理.
C#程序设计基础 第二章 数据类型.
第六章 属性、索引器、委托和事件.
類別與物件 I (Classes and Objects I)
第三章 C# 基础知识.
第五讲 酒店客房管理系统(一) 教育部“十二五”职业教育国家规划教材
第4章 PHP流程控制语句.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
$9 泛型基础.
C#面向对象程序设计 $6 深入理解类.
C#程序设计基础 $3 成员、变量和常量.
第7章 异常处理.
第十二章 命名空间和异常处理 丘志杰 电子科技大学 计算机学院 软件学院.
第12章 异常处理 C++自身有着非常强的纠错能力,发展到如今,已经建立了比较完善的异常处理机制. C++的异常情况无非两种,一种是语法错误,即程序中出现了错误的语句、函数结构和类,致使编译程序无法进行。另一种是运行时发生的错误,一般与算法有关。 关于语法错误, C++编译器的报错机制可以让我们轻松地解决这些错误;
第4章 Excel电子表格制作软件 4.4 函数(一).
第二章 Java语法基础.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
Java程序设计 第17章 异常和断言.
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
3.7 Java的异常处理机制.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
C++面向对象程序设计 谭浩强编著 授课教师:姬广永 学习网站:
第2章 Java语言基础.
第6章 异常处理 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
第4讲 类和对象、异常处理 ggao.
第四章 UNIX文件系统.
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
C#快速導讀 流程控制.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
Presentation transcript:

$14 异常处理

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

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

异常处理办法 代码检查(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("程序发生异常,请检查您的输入是否有误。"); } } }}

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

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("程序运行过程中发生异常。");

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

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;

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

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

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("通过验证...");

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

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

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

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

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

异常层次结构图

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