轻松学C之异常处理.pptx_第1页
轻松学C之异常处理.pptx_第2页
轻松学C之异常处理.pptx_第3页
轻松学C之异常处理.pptx_第4页
轻松学C之异常处理.pptx_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

第11章异常处理 异常是程序运行时产生的错误 如果不处理这些错误 会造成程序无法按照预期执行 从而给用户造成重大的损失 C 提供完善的处理机制来防止这类情况的发生 本章将详细讲解如何进行异常处理 11 1异常处理的基础 异常指的是程序在运行时产生的错误 异常处理的优点是 它可以自动加载许多错误处理代码 而在以前 开发人员必须手动把它们输入到任何大型程序中 异常处理允许程序定义代码块以简化错误处理 这个代码块称为异常处理程序 C 为常见的程序错误定义了标准的异常 要想成为一名合格的C 编程人员 就必须完全掌握C 的异常处理子系统 11 1 1什么是异常 异常用来表示在应用程序执行期间发生的错误 以及其他的意外行为 以下这些情况有可能引发异常 q代码或调用的代码中有错误q操作系统资源不可用q公共语言运行库遇到意外情况q自定义抛出异常q其他其中某些异常是可以恢复的 而有一些则不能 在 NETFramework中 用Exception类表示基类异常 大多数异常对象都是Exception的或其某个派生类的实例 但是 任何从Object类派生的对象都可以作为异常引发 11 1 2未捕获异常的后果 一般情况下 如果异常没有被程序自身捕获 那么C 运行时系统就会捕获该异常 示例11 1 使用for语句遍历数组 当i 4的时候 发生数组越界异常 这时 程序没有捕获索引超出边界的异常 注意 运行时系统不仅会报告错误 而且会终止程序的运行 11 1 3常用异常 System名称空间定义了一些标准的内置异常 这些异常在出现运行时错误时由CLR产生 C 中常用的标准异常如下表所示 11 1 4异常处理 异常处理需要用4个关键字 try catch throw和finally 它们构成了一个相关的子系统 在这个子系统中 一个关键字的使用暗含着另一个关键字的使用 下面我将介绍它们的工作方式 11 1 5使用try和catch关键字 异常处理的核心是try和catch关键字 这两个关键字必须配套使用 不能只使用try而不使用catch 也不能只使用catch而不使用try try catch异常处理块的通用形式如下图所示 其中 ExcepType是所产生的异常的类型 系统抛出一个异常时 相应的catch子句捕获并处理它 可以有多条catch子句与一个try块相关联 由异常的类型决定执行哪条catch语句 也就是说 如果catch子句指定的异常类型与实际异常的类型相匹配 就会执行该catch子句 而绕过其他catch子句 在捕获异常时 异常变量exOb将获得其参数值 如果没有抛出任何异常 那么try块将正常结束 并且绕过它的相关catch子句 程序将继续执行最后一条catch子句之后的语句 这就意味着只有在抛出异常时 才会执行catch子句 示例11 2 简单说明了如何监视并捕获异常 执行流程如下图所示 注意 第一 希望监控是否出现错误的代码包含在try块 第二 当出现异常时 try块将抛出一个异常 catch块则负责捕获该异常 此时 try块终止 控制权传递给catch块 这里不是调用catch块 而是把程序的执行转向它 索引超出范围之后的WriteLine 语句将不会执行 执行catch块之后 程序控制权交给catch块之后的语句 因此 由异常处理程序完成对异常代码的处理 从而使得程序能正常执行 如果try块未抛出异常 就不会执行任何catch子句 程序控制权直接交给最后一条catch子句后面的语句 11 2处理异常 异常处理的最大优点之一是 它允许程序对错误做出响应并继续执行 11 2 1使用异常处理错误 示例11 3 使用数组中的一个元素除以另一个元素 如果出现被零除的情况 就会产生DivideByZeroException异常 其中 每次循环重新进入try块时 前面的异常都已得到处理并移除 从而程序能够处理重复出现的错误 11 2 2使用多条catch语句 一个try块可以与多条catch子句相关联 但是 每条catch子句必须分别捕获不同类型的异常 运行流程如下图所示 示例11 4 下面的程序将捕获数组索引越界错误和被零除错误 11 2 3嵌套try块 一个try块能够嵌套在另一个try块中 内层try块中产生的异常如果未被相关联的catch子句捕获 就会传递到外层try块中 示例11 5 下面程序介绍嵌套的try块 其中 IndexOutOfRangeException异常由外层try块捕获 而不是由内层try块捕获 11 2 4抛出异常 可以使用throw语句手动地抛出异常 它的通用形式如下图所示 这里的exceptOb必须是从Exception类派生的异常类的对象 示例11 6 以下程序使用throw语句手动的抛出DivideByZeroException异常 其中 throw语句中使用new关键字创建了一个DivideByZeroException异常 注意 throw语句抛出的是一个对象 11 2 5重新抛出异常 重新抛出异常是为了能让多个处理程序访问它 在重新抛出异常时 只需要直接使用throw语句 而不必指定异常 形式为 示例11 7 以下程序演示重新抛出异常 这里被零除错误由GenException 方法在本地处理 数组索引越界错误IndexOutOfRangeException则重新抛出 由RethrowDem类中的Main 方法处理 注意 重新抛出的异常不会被原来的catch子句捕获 而是会传递到外层的catch子句 throw 11 2 6finally语句 finally块提供了一种保证资源清理或者是资源恢复的机制 它的通用形式如下图所示 示例11 8 下面程序演示不论try块是正常结束还是异常结束 finally块中的代码都会执行 finally必须紧接在try块之后 或者紧接在try块之后的最后一个catch子语句之后 否则会出现如下图所示的错误 11 3自定义异常类 如果系统提供的异常类 己经不能够满足应用系统开发的需要 或者开发团队需要一套自定义异常处理机制 可以创建自定义的异常类 自定义异常的编写通常有以下规则 q避免使用很深的异常层次结构 q尽量从System Exception或其他常见基本异常之一派生异常 而不是从ApplicationException派生自定义异常 q异常类名称尽量使用Exception作为结尾 q一定要在所有异常上都提供常见构造函数 q详细的编写自定义异常的相关信息 自定义异常类的通用形式如下图所示 其中 AbcException是自定义异常类 从ApplicationException继承 使用base关键字让AbcException方法继承自基本的错误异常类ApplicationException并提供了两个参数 一个异常消息参数和一个异常错误类 示例11 9 创建一个自定义的异常类EmailException 将正常执行的代码放在try块中 如果格式错误 用throw手动抛出异常 在后面添加catch语句捕获异常 进行处理 输出错误提示 调试此程序发现 即使用email格式输入错误 也不会中断程序运行 而是直接输出错误提示 11 4checked和unchecked关键字 某些类型的算术运算所产生的结果可能会超出所涉及数据类型的取值范围 这就是所谓的溢出 在C 中 用户可以指定程序在溢出时是否产生异常 通过checked和unchecked关键字实现该操作 如果希望测试表达式中是否产生了溢出 则使用checked关键字 而如果希望忽略溢出 则使用unchecked关键字 11 4 1checked checked关键字有两种通用形式 一种用于检查具体的表达式 称为运算符形式 另一种用于检查语句块 称为语句形式 如下图所示 其中 expr是检查溢出的表达式 如果被检查的表达式产生了溢出 就抛出OverflowException异常 11 4 2unchecked unchecked关键字也有两种通用形式 一种是运算符形式 它可以忽略某个具体表达式的溢出 另一种形式可以忽略语句块的溢出 如下图所示 其中 expr是不检查溢出的表达式 如果该表达式产生了溢出 那么将截断其结果 示例11 10 以下程序使用了checked和unchecked关键字用于单一表达式中 示例11 11 下面程序展示ch

温馨提示

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

评论

0/150

提交评论