1、2023年12月12日星期二DELPHI程序设计基础教程第七章 异常处理t 7.1 异常与Delphi的异常类 t 7.2 异常保护和处理机制 t 7.3 异常处理应用 2023年12月12日星期二DELPHI程序设计基础教程本章学习导读t程序运行过程中,不可避免的会出现异常或错误,我们平时所使用的操作系统也经常会出现各种问题,因此在程序的开发中如何检测和处理程序的运行错误是一个关键问题。通过Delphi的异常处理机制,可以捕获这些异常并进行处理。Delphi全面支持异常处理,定义了大量的异常处理对象,使程序能够处理几乎所有的异常情况。t本章首先介绍Delphi中的异常种类,然后介绍异常保护和
2、处理机制,最后给出一个应用程序中处理异常的实例,使大家能深入了解异常。2023年12月12日星期二DELPHI程序设计基础教程 7.1 异常与Delphi的异常类 t异常处理机制建立在保护块的基础上,所谓保护块是指介于关键字try和end之间的一段代码,当保护块中的代码发生异常时自动创建一个相应的异常类,程序可以捕获并处理这个异常,以确保程序的正常结束以及资源的释放,若无法处理则会弹出一个消息框。t异常类是Delphi异常处理机制的核心,Delphi提供的所有异常类都从Exception类继承,Exception类包含在SysUtils单元中。2023年12月12日星期二DELPHI程序设计基
3、础教程 7.1 异常与Delphi的异常类 t运行期间库异常类 运行期间库异常类用于处理运行期间的一些异常,运行期间库异常可以分为7类,它们都定义在SysUtils单元中。(1)I/O异常。I/O异常EInOutError是在程序运行中试图对文件或外部设备进行操作失败后产生的,它从Exception派生后增加了一个公有数据成员ErrorCode,用于保存所发生错误的代码。在发生异常时,通过访问该属性可以针对不同情况采取不同的对策。通过编译开关$I可以指定是否使用I/O异常类。当编译开关为$I时,将在程序中使用I/O异常类。当编译开关为$I-时,不产生I/O异常类,而是直接把错误代码返回到预定义
4、变量IOResult中。(2)堆异常。堆异常是在动态内存分配中产生的,包括2个类EOutOfMemory和EInvalidPointer。(3)整数异常。整数异常都是从EIntError类派生的,但在程序运行中引发的总是它的子类:EDivByZero,ERangeError,EIntOverFlow。2023年12月12日星期二DELPHI程序设计基础教程 7.1 异常与Delphi的异常类 (4)浮点异常。浮点异常都是从EMathError类派生,与整数异常相似,在程序运行中总是引发它的子类:EInvalidOp、EZeroDivide、EOverFlow、EUnderFlow。浮点异常是在
5、进行实数操作时产生的。(5)类型匹配异常。当试图用As操作符把一个对象强制匹配为另一类对象失败后,引发类型匹配异常EInvalidCast。(6)类型转换异常。当试图从一种数据类型转换为另一种数据类型时,如果不能直接转换则引发类型转换异常EConvertError。(7)硬件异常。硬件异常在以下两种情况下发生:1、处理器检测到一个它不能处理的错误;2、程序产生一个中断企图中止程序的执行。2023年12月12日星期二DELPHI程序设计基础教程 7.1 异常与Delphi的异常类 t控件异常类 在操作和使用控件的过程中,不可避免的会遇到控件异常。控件异常分为预定义异常和通用异常。Delphi为某
6、些特定的控件预定义了一些常见的异常情况,这类异常被称为预定义异常。所有控件都可能出现的异常被称为通用异常。(1)预定义异常 Delphi为许多控件都定义了异常类,下面介绍几个典型的预定义异常:1、EMenuError 2、EInvalidGridOperation 3、EDatabaseError和EReportError (2)通用异常 Delphi定义了许多通用异常,下面介绍几个常用的通用异常:1、EInvalidOperation 2、EComponentError 3、EOutOfResource2023年12月12日星期二DELPHI程序设计基础教程 7.1 异常与Delphi的异常
7、类 t其它组件异常 其它组件异常是指除了控件以外的其它组件引发的异常,包括流异常、图形异常、打印异常和字符串链表异常等。(1)流异常。流异常包括EStreamError、EFCreateError、EFOpenError、EFileError、EReadError、EWriteError、EClassNotFound,流异常在Classes库单元中定义(2)图形异常。包括EInvalidGraphic和EInvalidGraphicOperation两类,在Graphic库单元中定义(3)打印异常。当打印发生错误时(如向一个不存在的打印机发送打印任务)引发,它在Printers库单元中定义。(
8、4)字符串链表异常。包括EStringListError和EListError两类,它们在用户对字符串链表进行非法操作时引发。由于许多控件(如ListBox、Memo)都有一个TStrings类的重要属性,因此字符串链表异常在编程中非常有用 2023年12月12日星期二DELPHI程序设计基础教程 7.2 异常保护和处理机制 通常为容易出现错误的代码添加保护,将代码块放入try语句之后实施保护,异常处理通常有两种结构:tryexceptend和tryfinallyend。前者为开发者提供了一个按自己的需要进行异常处理的机制;后者与资源有关,确保异常发生后资源能够正常释放。1使用tryexcep
9、tend处理异常trytry 要进行保护的代码,这些代码很容易出现异常要进行保护的代码,这些代码很容易出现异常 exceptexcept on exception1 do on exception1 do 处理处理exception1exception1的语句的语句 on exception2 do on exception2 do 处理处理exception2exception2的语句的语句 else else 提供默认响应提供默认响应 /else /else语句放在语句放在 中表明中表明elseelse语句可有可无语句可有可无end;end;try和except之间的语句是希望正常执行的代
10、码,在执行过程中如果出现了异常,则程序跳入except部分执行。值得注意的是:正常情况下,except之后的语句是不执行的,只有在出现异常的情况下才会执行。2023年12月12日星期二DELPHI程序设计基础教程 7.2 异常保护和处理机制使用tryfinallyend处理异常 tryfinallyend主要用于在发生异常的情况下,及时释放程序所占用的资源,如内存、文件等等。因为整个系统的资源总是有限的,程序必须在运行结束后及时释放所占用的资源,才能保证系统的正常运行。tryfinally end结构语法如下:trytry 要进行保护的代码,这些代码很容易出现异常要进行保护的代码,这些代码很容
11、易出现异常 finallyfinally 不管是否发生异常都必须执行的代码,一般用来释放不管是否发生异常都必须执行的代码,一般用来释放资源资源 end;end;2023年12月12日星期二DELPHI程序设计基础教程 7.3 异常处理应用 下面通过一个具体的应用演示异常处理的应用,在这个例子中定义了一个InValidateID类,当用户名不正确时引发该异常。(1)新建一个Application;(2)向窗体Form1中添加一个Label组件,将其Caption属性设置为“应用程序主窗口”;(3)单击“文件|新建|窗体”,创建一个新窗体,用于登陆时验证,添加两个Label组件,分别将其Capti
12、on属性设置为“用户名”、“密码”(4)放置两个Edit组件到窗体上,将其Text属性清空,将密码文本框的Passwordchar属性设置为“*”(5)放置两个按钮到窗体上,将其Caption属性分别设置为“登陆”和“取消”。(6)选中Form1窗体,单击“文件|使用单元”,出现“Use Unit”对话框,选中Unit2单击“OK”按钮,添加Unit2的引用。(7)选中Form1,在对象检视器中打开“Events”选项卡,选中OnShow事件,出现一个下拉列表框,双击下拉列表框,输入如下代码:if Form2.ShowModal=mrCancel thenCloseelseForm2.Clos
13、e;(8)选中Form2窗体,按下“F12”,打开代码编辑,在“var”语句之前添加如下代码:typeEInValidateID=class(Exception)publicconstructor Create(msg:String);end;2023年12月12日星期二DELPHI程序设计基础教程7.3 异常处理应用(9)在“implementation”之后添加如下代码:constructor EInValidateID.Create(msg:String);begininherited Create(msg);end;(10)双击“登陆”按钮,输入如下代码:if Edit1.TextAd
14、min thenRaise EInValidateID.Create(无效的用户名);if Edit2.Text=1234 thenModalResult:=mrOKelseModalResult:=mrCancel;(11)双击“取消”按钮,输入如下代码:ModalResult:=mrCancel;(12)运行程序,当用户名为Admin,密码为1234时主窗体出现。2023年12月12日星期二DELPHI程序设计基础教程实训代码(7)选中Form1,在对象检视器中打开“Events”选项卡,选中OnShow事件,出现一个下拉列表框,双击下拉列表框,输入如下代码:if Form2.ShowMo
15、dal=mrCancel thenCloseelseForm2.Close;(8)选中Form2窗体,按下“F12”,打开代码编辑,在“var”语句之前添加如下代码:const User:array1.3 of String=(zhang,li,wang);const Pass:array1.3 of String=(111,222,333);typeEInValidateID=class(Exception)public constructor Create;end;EInValidatePassword=class(Exception)public constructor Create;e
16、nd;2023年12月12日星期二DELPHI程序设计基础教程实训代码(9)在“implementation”之后添加如下代码:constructor EInValidateID.Create;begin inherited Create(无效的用户名);end;constructor EInValidatePassword.Create;begin inherited Create(无效的密码);end;(10)双击“登陆”按钮,使登陆按钮的代码如下所示:procedure TForm2.Button1Click(Sender:TObject);var i:integer;begin for
17、 i:=low(User)to high(User)do if Useri=Edit1.Text then Break;if ihigh(User)thenRaise EInValidateID.Create;if Edit2.TextPassi thenRaise EInValidatePassword.Create;ModalResult:=mrOK;end;(11)双击“取消”按钮,输入如下代码:ModalResult:=mrCancel;(12)运行程序,输入用户名“zhang”、密码“111”或者用户名“li”、密码“222”或者用户名“wang”、密码“333”时出现主程序界面。2023年12月12日星期二DELPHI程序设计基础教程本章小结t 开发健壮的程序是开发人员所追求的目标,这就需要考虑到多种可能引发异常的情况,适时的抛出异常,或者使用自定义异常。本章介绍了Delphi中的异常种类,并给出了自定义异常的使用方法,通过Delphi完善的异常处理机制能够处理大部分异常。
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。