12.1 Delphi异常处理机制与异常类
Delphi异常处理机制建立在保护块(Protected Blocks)的概念上。所谓保护块是用保留字try和end封装的一段代码。保护块的作用是当应用程序发生错误时自动创建一个相应的异常类(Exception)。程序可以捕获并处理这个异常类,以确保程序的正常结束以及资源的释放和数据不受破坏。如果程序不进行处理,则系统会自动提供一个消息框。异常类是Delphi异常处理机制的核心,也是Delphi异常处理的主要特色。下面我们对异常类的概念和体系进行详细的介绍。Delphi提供的所有异常类都是类Exception的子类。用户也可以从Exception派生一个自定义的异常类。Exception类的定义如下,对于不常用的成员没有列出。 {SysUtils 单元中}Exception = class(TObject)privateFMessage: PString;FHelpContext: Longint;function GetMessage: String;procedure SetMessage(const Value: String);publicconstructor Create(const Msg: String);constructor CreateFmt(const Msg: String; const Args: array of const);. . . destructor Destroy; override;property HelpContext: Longint property Message: String;property MessagePtr: PString;end; Exception的一系列构造函数中最重要的参数是显示的错误信息。而数据成员中最重要的也是可被引用的消息字符串(message,messagePtr)。 这些信息分别对自定义一个异常类和处理一个异常类有重要作用。Delphi提供了一个很庞大的异常类体系,这些异常类几乎涉及到编程的各个方面。从大的方面我们可以把异常类分为运行时间库异常、对象异常、部件异常三类。下面我们分别进行介绍。 12.1.1 运行时间库异常类(RTL Exception) 运行时间库异常可以分为七类,它们都定义在SysUtils库单元中。 12.1.1.1 I/O异常 I/O异常类EInOutError是在程序运行中试图对文件或外设进行操作失败后产生的,它从Exception派生后增加了一个公有数据成员ErrorCode,用于保存所发生错误的代码。这一成员可用于在发生I/O异常后针对不同情况采取不同的对策。当设置编译指示{$I- } 时,不产生I/O异常类而是把错误代码返回到预定义变量IOResult中。 12.1.1.2 堆异常 堆异常是在动态内存分配中产生的,包括两个类EOutOfMemory和EInvalidPointer。表12.1 堆异常类及其产生原因━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━异常类 引发原因─────────────────────────────────EOutOfMemory 没有足够的空间用于满足所要求的内存分配EInvalidPointer 非法指针。一般是由于程序试图去释放一个业已释放的指针而引起的━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━