Delphi异常处理详解全.docx

上传人:b****7 文档编号:9802117 上传时间:2023-02-06 格式:DOCX 页数:10 大小:21.06KB
下载 相关 举报
Delphi异常处理详解全.docx_第1页
第1页 / 共10页
Delphi异常处理详解全.docx_第2页
第2页 / 共10页
Delphi异常处理详解全.docx_第3页
第3页 / 共10页
Delphi异常处理详解全.docx_第4页
第4页 / 共10页
Delphi异常处理详解全.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

Delphi异常处理详解全.docx

《Delphi异常处理详解全.docx》由会员分享,可在线阅读,更多相关《Delphi异常处理详解全.docx(10页珍藏版)》请在冰豆网上搜索。

Delphi异常处理详解全.docx

Delphi异常处理详解全

Delphi_异常处理_详解(全.txt

Delphi异常处理详解

[1]Exception类的定义在SysUtils单元中。

[2]Delphi也支持不从Exception继承的异常类,但是我觉得这么做并不十分的明智。

一、异常的来源

在Delphi的应用程序中,下列的情况都比较有可能产生异常。

(1文件处理

(2内存分配

(3Windows资源

(4运行时创建对象和窗体

(5硬件和操作系统冲突

二、异常的处理

(1try…except…end;

在try体内的代码发生异常时,系统将转向except部分进行异常的处理。

这是Delphi处理异常的最基本的方式之一。

(2try…finally…end;

这种异常处理结构一般用于保护Windows的资源分配等方面,它确保了无论try体内的代码是否发生异常,都需要由系统进行最后的统一处理的一些Windows对象的正确处理。

和try…except…end不同,该结构的finally部分总被执行。

(3不存在try…except…finally…end结构来既处理异常,又保护资源分配的结构,但是,try…except…end结构允许嵌套到try…finally…end结构中,从而实现既处理异常,又保护资源的分配。

三、异常的精确处理

(1定义一个异常。

在Delphi中,每个异常都是Exception[1]类的一个派生类[2]。

因此,定义一个异常就是定义一个Exception类的派生类。

typeEMyException=class(Exception;

当然,基类可以是Exception或者Exception的任何一个任何层次的派生类。

(2在程序中抛出一个异常。

根据不同的情况抛出异常是使用异常的最基本的模式。

在Delphi中,由raise语句来实现。

【语法】raise异常类.Create(„异常的缺省说明‟;

(3在try…except…end中更加精确的捕捉异常。

使用onE:

异常类do…结构可以在do体内处理特定异常类所抛出的异常。

四、异常的调试

在DelphiIDE中,解除“DebuggerOptions”(可以使用菜单Tools—>DebuggerOptions…进行访问中的IntegratedDebugging复选框的勾选状态可以进行异常的调试。

五、异常的补充说明

(1每一段程序都有可能产生错误!

这是软件业的一个不容置疑的现象和规律。

事实上,传统的if…else…结构完全可以解决所有的错误,使用Exception机制也没能够回避在最原始的层次,通过遍历可能的情况来产生异常的做法,那么,为什么还要异常机制?

答案很清楚:

异常提供了一种更加灵活和开放的方式,使得后来的编程者可以来根据实际的情况处理这种错误,而不是使用预先设定好的处理结果。

Delphi7异常处理

了解什么是异常和Delphi7中提供的异常类

掌握Delphi7环境下自定义异常的方法和异常

处理的语法结构与实现

异常

什么是异常

程序开发过程中,有编译期错误和运行期错误,编译期错误很容易发现,而运行期错误(逻辑错误和异常往往很难预料.为了程序的稳定性和可靠性,就需要对程序异常处理和保护.

异常:

理解为一种特殊的事件,该事件发生时,程序的正常执行将被打断.

由程序导致的不正常情况是错误而不是异常,程序错误与异常不是相同的概念.

异常是为方便用户报告错误并处理错误而创建的机制,一般是由操作系统完成的.

运行期错误处理

软件开发过程中,程序员必须提供适度的方式来处理不可避免的错误.一般方法如下:

1传统方法

2使用异常进行错误处理

传统方法

在Pascal早期版本中,程序员必须借助编译器开关和状态变量去检测和处理存在的错误.

{$I-}{此编译器指令关闭I/O检测}

Assign(InFile,InputName;

Reset(InFile;

{$I+}{此编译器指令恢复I/O检测}

IfIOResult0then

{错误处理代码};

使用异常进行错误处理

结构化异常处理是Delphi语言内建的特性.为我们处理异常提供了方便.处理异常有两方面:

1异常处理可确保适当地恢复在应用程序中分配或改变的任何资源.

2结构化异常处理为开发人员提供了一种一致的处理各种类型运行期错误的方式

Delphi7异常处理机制

异常处理的基本思想是通过提供规范方式处理软,硬件错误的能力,使程序更加健壮.

异常处理可以将处理错误的代码与正常的逻辑处理代码相分离.

Delphi缺省的方式是在应用程序收到异常之前捕获异常.IDE会给出一个”预警”对话框,以指明应用程序将要产生异常.

异常处理机制是一种程序设计安全策略,它是建立在保护块思想上,通过try和end语句块对代码的封装确保在程序发生异常时,程序能够正常运行或释放所占用的资源.

Delphi7异常处理机制

传统程序设计中,用如下的伪代码方法来检查和处理程序错误:

执行一个任务

If前一个任务未能正确执行

执行错误处理

执行下一个任务

If前一个任务未能正确执行

执行错误处理

……

Delphi7异常处理机制

例;

try

Age:

=StrToInt(Edit1.Text;

ShowMessage(Format('生于%d年',[YearOf(Now-Age];

except

onEConvertErrordo

showmessage('输入编辑框的不是一个有效的数字!

';

onERangeErrordo

showmessage('输入编辑框的年龄值太大!

';

end;异常类

Delphi7根据异常类型定义了相应的异常类.所有异常类的基类都是Exception类.

Delphi7内置了大量的异常类,用户也可以通过Exception类自定义异常类.

记住异常类的要点:

1异常类是响应不同异常现象的入口.

2熟悉异常类的层次结构.

Exception异常类

Exception是所有异常类的基类,它并不是以‟T'开头,而是以‟E'开头,它的派生类也是以‟E'开头的.

Exception类定义于SysUtils单元中.

Exception类最常用的方法是Create方法:

ConstructorCreate(constMsg:

string;

Exception.Create(„我自己创建的异常!

‟;

该方法用于创建一个异常类的实例,也可以显示错误信息,也可直接用这个方法提交一个异常raiseException.Create(„我抛出的异常!

‟;

例:

try

raiseException.Create('我抛出的异常!

';

except

onE:

Exceptiondo

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异常

EInOutErrorDOS输入/输出错误

字符转换/类型转换异常和哑异常

字符转换异常

EConvertError数字到字符串或字符串到数

字转换错误

类型转换异常

EInvalidCast类型转换异常

哑异常

EAbort调用Abort产生,不显示错误提示框

对象异常类

对象异常类是针对非组件对象引发的异常而定义的.对象异常类包括:

1流异常类

2打印异常类

3图形异常类

4字符串链表异常类

流异常类流异常是指在程序中进行与流相关的操作时产生的异常.流异常类的基类是EStreamError,其他流异常类都直接或间接从它派生.派生关系见书48页图打印异常打印异常是由于应用程序向不存在的打印机发送打印命令或由于某种原因打印工作无法送到打印机时引发的.打印异常类为Eprinter,定义于Printers单元图形异常图形异常主要包括EInvalidGraphic和EInvalidGraphicOperation两个类均定义于Graphics单元EInvalidGraphic异常满足下列情况之一时引发:

当应用程序试图向一个并不包含合法的位图,图象,元文件或用户自定义图形类型的文件中装入图象时.当应用程序试图装入不可识别扩展名的文件时当图象与LoadFromClipboardFormat或SaveToClipboardFormat中的格式不匹配时.当应用程序试图将图象的PixelFormat设为不支持的值EInvalidGraphicOperation异常在满足下列条件之一时发生:

应用程序访问图象中不存在的扫描线时.应用程序不能成功写入图象时.应用程序在画布未处于有效状态时进行绘制.应用程序装入未知或不支持的图象格式时.应用程序将图象的PixelFormat设为不支持的值时不能分配该操作的句柄时.字符串链表异常字符串链表异常是由于用户对字符串链表进行非法操作时引发的.包括EStringListError,EListError等.由于许多部件都有一个Tstrings抽象类的属性(如Tiistbox组件的Items属性等,因而字符串链表异常在组件编程中很重要.EStringListError一般在字符串链表越界时产生.而EListError异常通常在以下情况下发生:

当索引项超出链表范围时

当字符串链表的Duplicates属性设置为dupError同时应用程序试图加入一个重复的字符串时.当向已排序的字符串链表中插入字符串时.组件异常类组件异常类用于响应组件异常,组件异常是由于对VCL组件进行操作时,违反了组件的使用规则及其特征而引发的,可分为两大类:

通用组件异常、专用组件异常、通用组件异常。

常见的有非法操作异常,组件异常和资源不足异常三种类型,对应于EInvalidOpetation,EComponentError和EOutOfResource异常类.引发非法操作异常的原因有:

应用程序试图对Parent属性为nil的组件进行一些需要窗口句柄的操作.试图对窗体拖放操作.引发组件异常的原因有:

Delphi不能注册某个组件应用程序不能重命名某个组件资源不足异常被引发是由于当应用程序试图创建窗口句柄而操作系统没有多余的句柄可分配专用组件异常:

许多组件都定义了相应的组件异常类.列出几个典型的组件异常类:

EMenuError异常,菜单异常,是由于程序对菜单的非法操作而引发的.定义于Memus单元EInvalidGridOperation异常.非法的网格操作,如试图引用一个不存在的网格单元时引发.定义于Grids单元EDatabaseError异常.数据库异常是由于对数据库的非法操作引起的.用户自定义异常类创建用户自定义异常类的方法抛出自定义异常用户自定义异常类与内置异常类的区别异常类对象与其他类对象的区别创建用户自定义异常类的方法选择Exception作为基类,按照定义类的一般方法,建立自定义的异常类就可以了.如:

typeEMyException=class(Exception//需要定义属性或方法时,写在此处即可end;抛出自定义异常Delphi不会管理用户自定义异常的抛出,程序员必须自己抛出自己创建的异常.用raise语句可抛出异常:

raiseEMyException.Create('MyException';用户自定义异常类与内置异常类的区别Delphi不会自动响应用户自定义的异常类,所以用户自定义的异常类需要使用raise语句抛出,而内置异常类与运行期真实的异常现象相对应,当异常发生时,操作系统会捕捉到此异常,通知Delphi去响应.异常类对象与其他类对象的区别异常类对象创建后,不需要由用户释放它,当异常处理之后,系统会自动调用析构函数释放异常类对象.而其他类需要由用户来释放.Delphi7的异常处理结构try…finally语句块Try…except语句块使用raise抛出异常try…finally语句块try…finally语句块是用于资源保护和恢复系统状态,不管try部分的操作是否有异常发生,finally部分的操作都要进行.语法如下:

try被保护语句finally处理语句(无论异常是否发生,都必须处理end;try…finally语句块主要用于资源保护应用程序向系统申请了资源(如内存,图形句柄,当不需要这些资源时,就应该及时释放资源.句柄:

系统资源是有限的,一般构成一个资源链,链的长度是有限的,当系统给应用程序分配资源时,给每个资源设置一个ID号,这个ID号就是句柄.(系统资源相当于一个个房间,而句柄就相当于房间号.句柄有限:

1资源是有限的;2数字表达的范围也是有限的(整数有范围的Try…except语句块Try…except语句块用于运行期错误处理,程序员可以用它编写对不同类型异常的处理.

异常发生后,判断异常的类型,正确处理异常.Try…except语句块一般和On…Do子句连用;语法如下:

functionTest(x,y:

Real:

Real;begintryResult:

=x/y;//被保护语句exceptonEInvalidOpdoResult:

=0;//异常处理语句onEZeroDividedoResult:

=0;onEOverFlowdoResult:

=0;onEUnderFlowdoResult:

=0;end;end;Try…except语句块主要处理缺省异常用户一般只处理一些特殊的异常,并不是处理所有的异常.对那些用户不关心的异常就可以采用缺省异常来处理.try//正常程序代码exceptonEExceptionClassdo//处理特定类型的异常else//缺省异常处理end;注:

else块必须位于except块的最后,可响应任何类型的异常异常的传递Delphi对异常的处理方式是向后扫描程序的调用栈.假如过程A内有过程保护代码块,在此代码块内又调用了过程B,过程B没有异常保护,过程B调用了过程C,在C内发生了异常.如C内有该异常的处理程序,那么程序调用C的异常处理代码Delphi_异常处理_详解(全.txt

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1