第八章 异常概述.ppt_第1页
第八章 异常概述.ppt_第2页
第八章 异常概述.ppt_第3页
第八章 异常概述.ppt_第4页
第八章 异常概述.ppt_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八章异常概述 异常概述 异常是程序执行时遇到的任何错误情况或意外行为 以下这些情况都可以引发异常 用户代码或调用的代码 如共享库 中有错误 操作系统资源不可用 公共语言运行库遇到意外情况 如无法验证代码 等等 对于这些情况 应用程序可以从其中一些恢复 而对于另一些 则不能恢复 尽管可以从大多数应用程序异常中恢复 但不能从大多数运行库异常中恢复 在 NETFramework中 异常是从Exception类类继承的对象 异常从发生问题的代码区域引发 然后沿堆栈向上传递 直到应用程序处理它或程序终止 运行库如何管理异常 1 运行库使用基于异常对象和受保护代码块的异常处理模型 发生异常时 创建一个Exception对象来表示该异常 运行库为每个可执行文件创建一个异常信息表 在异常信息表中 可执行文件的每个方法都有一个关联的异常处理信息数组 可以为空 数组中的每一项描述一个受保护的代码块 任何与该代码关联的异常筛选器和任何异常处理程序 Catch语句 此异常表非常有效 在没有发生异常时 在处理器时间或内存使用上没有性能损失 仅在异常发生时使用资源 运行库如何管理异常 2 异常信息表对于受保护的块有四种类型的异常处理程序 Finally处理程序 它在每次块退出时都执行 不论退出是由正常控制流引起的还是由未处理的异常引起的 错误处理程序 它在异常发生时必须执行 但在正常控制流完成时不执行 类型筛选的处理程序 它处理指定类或该类的任何派生类的任何异常 用户筛选的处理程序 它运行用户指定的代码 来确定异常应由关联的处理程序处理还是应传递给下一个受保护的块 运行库如何管理异常 3 异常发生时 运行库开始执行由下列两步组成的过程 一 运行库在数组中搜索满足下列条件的第一个受保护块 保护包含当前执行的指令的区域 而且包含异常处理程序或包含处理异常的筛选器 二 如果出现匹配项 运行库创建一个Exception对象来描述该异常 然后运行库执行位于发生异常的语句与处理该异常的语句之间的所有Finally语句或错误处理语句 请注意 异常处理程序的顺序很重要 最里面的异常处理程序最先计算 还请注意 异常处理程序可以访问捕捉异常的例程的局部变量和本地内存 但引发异常时的任何中间值都会丢失 如果当前方法中没有出现匹配项 则运行库搜索当前方法的每一个调用方 并沿着堆栈一直向上查找 如果任何调用方都没有匹配项 则运行库允许调试器访问该异常 如果调试器不能附加到该异常 则运行库引发UnhandledException事件 如果没有UnhandledException事件的侦听器 则运行库转储堆栈跟踪并结束程序 筛选运行库异常 可以按类型或按某些用户定义的条件对捕捉和处理的异常进行筛选 类型筛选的处理程序处理特定类型的异常 或从该异常派生的类 最常见形式的类型筛选的异常处理程序指定仅捕捉特定类型的异常 下面的示例说明一个旨在捕捉特定异常 此例中为FileNotFoundException 的异常处理程序 catch FileNotFoundExceptione Console WriteLine DataFileMissing 0 e C 和C 中的异常的区别 1 C 中的异常提供了一个处理系统级和应用程序级错误状态的结构化的 统一的和类型安全的方法 C 中的异常机制非常类似于C 的异常机制 但是有一些不同的地方 C 和C 中的异常的区别 2 1 C 中 所有的异常必须从system Exeception派生的类类型的实例表示 而C 中的 任何类型的任何值都可以表示异常 2 在C 中 finally块可用于编写在正常执行和异常情况下都可以执行的终止代码 在C 中 很难在不重复代码的情况下编写这样的代码 3 在C 中 系统级的异常如溢出 被零除和null具有定义良好的异常类 并且与应用程序的错误状态是同等的 异常的处理 使用Try Catch块捕捉异常 1 将可能引发异常的代码节放在Try块中 而将处理异常的代码放在Catch块中 Catch块是一系列以关键字catch开头的语句 语句后跟异常类型和要执行的操作 注意几乎任何代码行都可以引发异常 尤其是公共语言运行库本身引发的异常 如OutOfMemoryException和StackOverflowException 大多数应用程序不必处理这些异常 但在编写由其他人使用的库时应知道这种可能性 使用Try Catch块捕捉异常 2 代码示例使用Try Catch块捕捉可能的异常 Main方法包含带有StreamReader语句的Try块 该语句打开名为data txt的数据文件并从该文件写入字符串 Try块后面是Catch块 该块捕捉Try块产生的任何异常 例子里 因为没有发现data txt而产生了异常 因此程序将引发异常报错 在catch块中使用特定异常 发生异常时 异常沿堆栈向上传递 每个Catch块都有机会处理它 Catch语句的顺序很重要 将针对特定异常的Catch块放在常规异常Catch块的前面 否则编译器可能会发出错误 确定正确Catch块的方法是将异常的类型与Catch块中指定的异常名称进行匹配 如果没有特定的Catch块 则由可能存在的常规Catch块捕捉异常 下面的代码示例使用Try Catch块捕捉InvalidCastException 该示例创建一个名为Employee的类 它带有一个属性 职员级别 Emlevel PromoteEmployee方法取得对象并增加职员级别 将DateTime实例传递给PromoteEmployee方法时 发生InvalidCastException 引发异常 可以使用Throw语句显式引发异常 还可以使用Throw语句再次引发捕捉的异常 好的编码做法是向再次引发的异常添加信息以在调试时提供更多信息 下面的代码示例使用Try Catch块捕捉可能的FileNotFoundException Try块后面是Catch块 Catch块捕捉FileNotFoundException 如果找不到数据文件 则向控制台写入消息 下一条语句是Throw语句 该语句引发新的FileNotFoundException并向异常添加文本信息 使用Finally块 异常发生时 执行将终止 并且控制交给最近的异常处理程序 这通常意味着不执行希望总是调用的代码行 有些资源清理 如关闭文件 必须总是执行 即使有异常发生 为实现这一点 可以使用Finally块 Finally块总是执行 不论是否有异常发生 下面的代码示例使用Try Catch块捕捉ArgumentOutOfRangeException Main方法创建两个数组并试图将一个数组复制到另一个数组 该操作生成ArgumentOutOfRangeException 同时错误被写入控制台 Finally块执行 不论复制操作的结果如何 使用用户定义的异常 1 如果希望用户能以编程方式区分一些错误条件 您可以创建自己的用户定义的异常 NETFramework提供根本上从基类Exception派生的异常类层次结构 这些类中的每一个都定义一个特定的异常 因此在很多情况下只需捕捉该异常 您也可以通过从ApplicationException类派生来创建自己的异常类 创建自己的异常时 好的编码做法是以 Exception 这个词作为用户定义的异常类名的结尾 如下面的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论