资源预览内容
第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
亲,该文档总共7页全部预览完了,如果喜欢就下载吧!
资源描述
.word可编辑.一、异常的来源 在Delphi的应用程序中,下列的情况都比较有可能产生异常。 (1)文件处理 (2)内存分配 (3)Windows资源 (4)运行时创建对象和窗体 (5)硬件和操作系统冲突 二、异常的处理 (1)tryexceptend; 在try体内的代码发生异常时,系统将转向except部分进行异常的处理。这是Delphi处理异常的最基本的方式之一。 (2)tryfinallyend; 这种异常处理结构一般用于保护Windows的资源分配等方面,它确保了无论try体内的代码是否发生异常,都需要由系统进行最后的统一处理的一些Windows对象的正确处理。 和tryexceptend不同,该结构的finally部分总被执行。 (3)不存在tryexceptfinallyend结构来既处理异常,又保护资源分配的结构,但是,tryexceptend结构允许嵌套到tryfinallyend结构中,从而实现既处理异常,又保护资源的分配。 三、异常的精确处理 (1)定义一个异常。 在Delphi中,每个异常都是Exception1类的一个派生类2。因此,定义一个异常就是定义一个Exception类的派生类。 type EMyException = class(Exception; 当然,基类可以是Exception或者Exception的任何一个任何层次的派生类。 (2)在程序中抛出一个异常。 根据不同的情况抛出异常是使用异常的最基本的模式。在Delphi中,由raise语句来实现。 【语法】raise 异常类.Create(异常的缺省说明; (3)在tryexceptend中更加精确的捕捉异常。 使用on E:异常类 do结构可以在do体内处理特定异常类所抛出的异常。 四、异常的调试 在Delphi IDE中,解除“Debugger Options”(可以使用菜单ToolsDebugger Options进行访问)中的Integrated Debugging复选框的勾选状态可以进行异常的调试。 五、异常的补充说明 (1)每一段程序都有可能产生错误!这是软件业的一个不容置疑的现象和规律。事实上,传统的ifelse结构完全可以解决所有的错误,使用Exception机制也没能够回避在最原始的层次,通过遍历可能的情况来产生异常的做法,那么,为什么还要异常机制? 答案很清楚:异常提供了一种更加灵活和开放的方式,使得后来的编程者可以来根据实际的情况处理这种错误,而不是使用预先设定好的处理结果。 Delphi7异常处理 了解什么是异常和Delphi7中提供的异常类 掌握Delphi7环境下自定义异常的方法和异常 处理的语法结构与实现 异常 什么是异常 程序开发过程中,有编译期错误和运行期错误,编译期错误很容易发现,而运行期错误(逻辑错误和异常往往很难预料.为了程序的稳定性和可靠性,就需要对程序异常处理和保护. 异常:理解为一种特殊的事件,该事件发生时,程序的正常执行将被打断. 由程序导致的不正常情况是错误而不是异常,程序错误与异常不是相同的概念. 异常是为方便用户报告错误并处理错误而创建的机制,一般是由操作系统完成的. 运行期错误处理 软件开发过程中,程序员必须提供适度的方式来处理不可避免的错误.一般方法如下: 1 传统方法 2 使用异常进行错误处理 传统方法 在Pascal早期版本中,程序员必须借助编译器开关和状态变量去检测和处理存在的错误. $I-此编译器指令关闭I/O检测 Assign(InFile,InputName; Reset(InFile; $I+此编译器指令恢复I/O检测 If IOResult0 then 错误处理代码; 使用异常进行错误处理 结构化异常处理是Delphi语言内建的特性.为我们处理异常提供了方便.处理异常有两方面: 1 异常处理可确保适当地恢复在应用程序中分配或改变的任何资源. 2 结构化异常处理为开发人员提供了一种一致的处理各种类型运行期错误的方式 Delphi7异常处理机制 异常处理的基本思想是通过提供规范方式处理软,硬件错误的能力,使程序更加健壮. 异常处理可以将处理错误的代码与正常的逻辑处理代码相分离. Delphi缺省的方式是在应用程序收到异常之前捕获异常.IDE会给出一个”预警”对话框,以指明应用程序将要产生异常. 异常处理机制是一种程序设计安全策略,它是建立在保护块思想上,通过try和end语句块对代码的封装确保在程序发生异常时,程序能够正常运行或释放所占用的资源. Delphi7异常处理机制 传统程序设计中,用如下的伪代码方法来检查和处理程序错误: 执行一个任务 If 前一个任务未能正确执行 执行错误处理 执行下一个任务 If 前一个任务未能正确执行 执行错误处理 Delphi7异常处理机制 例; try Age := StrToInt(Edit1.Text; ShowMessage(Format(生于%d年, YearOf(Now - Age; except on EConvertError do showmessage(输入编辑框的不是一个有效的数字!; on ERangeError do showmessage(输入编辑框的年龄值太大!; end;异常类 Delphi7根据异常类型定义了相应的异常类.所有异常类的基类都是Exception类. Delphi7内置了大量的异常类,用户也可以通过Exception类自定义异常类. 记住异常类的要点: 1 异常类是响应不同异常现象的入口. 2 熟悉异常类的层次结构. Exception异常类 Exception是所有异常类的基类,它并不是以T开头,而是以E开 头,它的派生类也是以E开头的. Exception类定义于SysUtils单元中. Exception类最常用的方法是Create方法: Constructor Create(const Msg:string; Exception.Create(我自己创建的异常!; 该方法用于创建一个异常类的实例,也可以显示错误信息,也可直接用这个方法提交一个异常 raise Exception.Create(我抛出的异常!; 例: try raise Exception.Create(我抛出的异常!; except on E: Exception do showmessage(异常类名称: + E.ClassName + #13#10 + 异常信息: + E.Message; end;Delphi7内置的异常类 Delphi7根据异常现象的类型定义了相应的异常类,这些异常类又称为Delphi7内置的异常类. 具体分为运行时库异常类,对象异常类和组件异常类三大类. 运行时库异常类(RTL 运行时库异常类可分为以下几种: 1 整数计算异常 2 浮点计算异常 3 硬件异常 4 堆异常 5 输入输出异常(I/O异常 6 字符转换异常 7 类型转换异常 8 哑异常 整数计算异常 EIntError 整数计算异常(基类 EDivByZero 整数除0溢处 EIntOverFlow 整数溢出 ERangeError 整数越界 浮点计算异常 EMathError 浮点计算异常(基类 EInvalidOp 无效浮点操作指令 Eoverflow 浮点操作上溢 Eunderflow 浮点操作下溢 EZeroDivide 浮点计算除0 硬件异常 EProcessorException 硬件异常(基类 ESingleStep 应用程序产生单步中断 Ebreakpoint 应用程序产生断点中断 Efault 故障(继承EProcessorException,也是基类 EStackFault 对处理器栈段的非法访问 EPageFault 内存管理器无法正确使用交换文件 EGPFault 保护性错误,一般由未初始化指针或对象造成 EInvalidOpCode 处理器遇到未定义指令 堆异常和(I/O异常 堆异常: EOutOfMemory 堆中没有足够的内存完成操作 EInvalidPointer 试图访问一个堆外的指针 (I/O异常 EInOutError DOS输入/输出错误 字符转换/类型转换异常和哑异常 字符转换异常 EConvertError 数字到字符串或字符串到数 字转换错误 类型转换异常 EInvalidCast 类型转换异常 哑异常 EAbort 调用Abort产生,不显示错误提示框 对象异常类 对象异常类是针对非组件对象引发的异常而定义的. 对象异常类包括: 1 流异常类 2 打印异常类 3 图形异常类 4 字符串链表异常类 流异常类 流异常是指在程序中进行与流相关的操作时产生的异常.流异常类的基类是EStreamError,其他流异常类都直接或间接从它派生. 派生关系见书48页图 打印异常 打印异常是由于应用程序向不存在的打印机发送打印命令或由于某种原因打印工作无法送到打印机时引发的. 打印异常类为Eprinter,定义于Printers单元 图形异常 图形异常主要包括EInvalidGraphic和 EInvalidGraphicOperation两个类均定义于G raphics单元 EInvalidGraphic异常满足下列情况之一时引发: 当应用程序试图向一个并不包含合法的位图,图象,元文件或用户自定义图形类型的文件中装入图象时. 当应用程序试图装入不可识别扩展名的文件时 当图象与LoadFromClipboardFormat或SaveToClipboardFormat中的格式不匹配时. 当应用程序试图将图象的PixelFormat设为不支持的值 EInvalidGraphicOperation异常在满足下列条件之一时发生: 应用程序访问图象中不存在的扫描线时. 应用程序不能成功写入图象时. 应用程序在画布未处于有效状态时进行绘制. 应用程序装入未知或不支持的图象格式时. 应用程序将图象的PixelFormat设为不支持的值时 不能分配该操作的句柄时. 字符串链表异常 字符串链表异常是由于用户对字符串链表进行非法操作时引发的. 包括EStringListError,EListError等.由于许多部件都有一个Tstrings抽象类的属性(如Tiistbox组件的Items属性等,因而字符串链表异常在组件编程中很重要. EStringListError一般在字符串链表越界时产生.而EListError异常通常在以下情况下发生: 当索引项超出链表范围时 当字符串链表的Duplicates属性设置为dupError 同时应用程序试图加入一个重复的字符串时. 当向已排序的字符串链表中插入字符串时. 组件异常类 组件异常类用于响应组件异常,组件异常是由于对VCL组件进行操作时,违反了组件的使用规则及其特征而引发的,可分为两大类: 通用组件异常、专用组件异常、通用组件异常。 常见的有非法操作异常,组件异常和资源不足异常三种类型,对应于EInvalidOpetation,EComponentError和EOutOfResource异常类. 引发非法操作异常的原因有: 应用程序试图对Parent属性为nil的组件进行一些需要窗口句柄的操作. 试图对窗体拖放操作. 引发组件异常的原因有: Delphi不能注册某个组件 应用程序不能重命名某个组件 资源不足异常被引发是由于当应用程序试图创建窗口句柄而操作系统没有多余的句柄可分配 专用组件异常:许多组件都定义了相应的组件异常类. 列出几个典型的组件异常类: EMenuError异常,菜单异常,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号