Delphi软件开发技术 教学课件 ppt 作者 张世明13316-Delphi软件开发技术教案(做完) P3

上传人:E**** 文档编号:89355681 上传时间:2019-05-23 格式:PPT 页数:307 大小:344.50KB
返回 下载 相关 举报
Delphi软件开发技术 教学课件 ppt 作者  张世明13316-Delphi软件开发技术教案(做完) P3_第1页
第1页 / 共307页
Delphi软件开发技术 教学课件 ppt 作者  张世明13316-Delphi软件开发技术教案(做完) P3_第2页
第2页 / 共307页
Delphi软件开发技术 教学课件 ppt 作者  张世明13316-Delphi软件开发技术教案(做完) P3_第3页
第3页 / 共307页
Delphi软件开发技术 教学课件 ppt 作者  张世明13316-Delphi软件开发技术教案(做完) P3_第4页
第4页 / 共307页
Delphi软件开发技术 教学课件 ppt 作者  张世明13316-Delphi软件开发技术教案(做完) P3_第5页
第5页 / 共307页
点击查看更多>>
资源描述

《Delphi软件开发技术 教学课件 ppt 作者 张世明13316-Delphi软件开发技术教案(做完) P3》由会员分享,可在线阅读,更多相关《Delphi软件开发技术 教学课件 ppt 作者 张世明13316-Delphi软件开发技术教案(做完) P3(307页珍藏版)》请在金锄头文库上搜索。

1、第3章Delphi异常处理与调试,利用Delphi的内置调试器,可以帮助你发现大部分程序错误。但并不是所有的错误都可以被发现,,为了保证应用程序可靠运行,应用程序必须对各种不正常的事件进行处理。,Delphi为此提供了一套强大的异常处理机制。巧妙地利用它,可以使程序更为强健,使用更为友好。,3.1 Delphi异常处理 3.2 Delphi异常类 3.3 Delphi异常处理机制 3.4 Delphi调试器 3.5 控制程序的运行 3.6 断 点 3.7 监视表达式的值 3.8 调试的有关窗口 3.9 特殊程序调试*,3.1 Delphi异常处理,3.1.1 异常处理的意义,所谓异常,可以理解

2、为一种特殊的事件。当这种特殊的事件发生时,程序正常的执行流程将被打断。,异常处理机制能够确保在发生异常的情况下应用程序不会中止运行,也不会丢失数据或资源。,Object Pascal定义了大量的异常处理对象,使应用程序几乎能够处理所有的异常情况,并且对异常处理的语法作了简化。,没有人能保证程序代码绝对不出错。有时候,即使程序本身没有错,但与程序打交道的软硬件设备出错,也会使程序出现异常。,引起异常的设备称为“异常源”,包括操作系统、设备驱动程序、数据库驱动程序、动态链接库、常驻内存的防病毒软件、Delphi自身的组件库和运行期库等。,异常几乎是不可避免的。过去,在没有异常处理机制的情况下,程序

3、员不得不小心翼翼地检查每一次函数调用的返回值,或者通过额外的代码捕获可能的错误。,采用了异常处理机制后,可以先假设程序不可能出错,按正常的顺序写代码。当代码在运行过程中出现异常时,将跳转到except部分,执行Exit。,3.1.2 错误类型,无论在编程的时候如何仔细,程序总会有错误。,错误分为四种类型: 设计期错误、 编译期错误、 运行期错误、 逻 辑错误。,1设计期错误 这种错误类型发生在设计期,通常是因为给组件的某个属性输入了非法的值。,例如,在设计数据库应用程序时指定了一个没有定义的数据库别名。,这种类型的错误比较容易被发现和纠正,因为Delphi能够对属性的值进行合法性检查。,一旦发

4、现这种错误,Delphi将弹出一个警告窗口,提示你纠正错误。,2编译期错误 编译期错误也叫语法错误,当程序代码违反了Object Pascal的语法规则时将发生这种错误。,如果程序代码中有语法错误,编译就不能通过,代码编辑器的状态栏将给出错误信息提示,并在代码编辑器中突出显示有语法错误的行。,3运行期错误 程序虽然通过了编译,但在运行时失败了,这种错误称为运行期错误。,运行期错误分两种情况,一种是运行时随运行异常环境或用户输入的错误参数而造成运行错误,,这种情况的“错误”往往无法在交付前通过调试排除,而通常由“异常处理”来解决。,另一种是不随环境和参数变化都会产生的运行错误,这种情况下,如果不

5、能确认错误发生在什么地方,可以使用Delphi的内部集成调试器帮助你找到错误所在。,例如,可以通过单步执行命令让程序一条语句一条语句地执行,或者通过一个观察窗口来监视某个变量的变化情况。,4逻辑错误 逻辑错误是指程序通过了编译,也能执行,但执行的结果与预期的不同。,逻辑错误有时比较难找,因为编译器无法识别这种错误。,此时,需要用内部集成调试器,通过控制程序的运行以及监视程序的输出,来把错误逐步定位在一个较小的范围内。,怎样尽可能地减少错误 虽然错误是很难避免的,但好的编程习惯能够尽可能地减少错误。建议:,(1) 程序应尽可能地模块化 程序分解为模块后,由于每个模块所要完成的任务相对简单了,所以

6、发生错误的可能也就减少了。模块化还简化了程序的维护。,(2) 养成良好的代码书写习惯 注释能够增加代码的可读性,方便维护和修改。缩进能够使程序的语法结构更加清晰。,(3) 不要忘记检查参数的值 在函数内部,首先要检查传递过来的参数值是否合法,是否在一个可接受的范围内。,(4) 不要忘记检查函数的返回值 函数的返回值往往表示函数调用是否成功,以此决定下面的程序流程。如果贸然执行下一步,有可能会出现意想不到的结果。,3.2 Delphi异常类,异常就是不正常或者是不可预料的情况,它干扰正常的程序流。,异常类是Delphi异常处理机制的核心,也是Delphi异常处理的主要特色。,Delphi提供的所

7、有异常类都是类Exception的子类。用户也可以从Exception派生一个自定义的异常类。,Exception的一系列构造函数中最重要的参数是显示的错误信息。,而数据成员中最重要的也是可被引用的消息字符串(message,messagePtr)。这些信息分别对自定义一个异常类和处理一个异常类有重要作用。,Delphi提供了一个很庞大的异常类体系,这些异常类几乎涉及到编程的各个方面。,从大的方面我们可以把异常类分为运行库异常、对象异常、组件异常三类。,3.2.1 运行库异常类,运行库异常可以分为七类,它们都定义在SysUtils库单元中。 1IO异常 2堆异常 3整数异常,4浮点异常 5类型

8、匹配异常 6类型转换异常 7硬件异常,3.2.2 对象异常类,1流异常类 2打印异常类 3图形异常类 4字符串链表异常,3.2.3 组件异常类,1通用组件异常类 2专用组件异常类,3.3 Delphi异常处理机制,Delphi异常处理机制建立在保护块的概念上。所谓保护块是用保留字try和end封装的一段代码。,保护块的作用是当应用程序发生错误时自动创建一个相应的异常类(Exception)。,程序可以捕获并处理这个异常类,以确保程序的正常结束以及资源的释放和数据不受破坏。如果程序不进行处理,则系统会自动提供一个消息框。,3.3.1 异常响应与try-except语句,异常响应为开发者提供了一个

9、按自己的需要进行异常处理的机制。 tryexceptend形成了一个异常响应保护块。,正常情况下except后面的语句并不被执行,而当异常发生时程序自动跳到except,进入异常响应处理模块。当异常被响应后异常类自动清除。,try except语句的一般格式如下:,try /try保护代码块 被保护语句 except /异常处理块 异常处理语句 /异常不发生,不处理 end; 或,try /try保护代码块 被保护语句 except /异常处理块,on do /捕获指定类型的异常对象,进行处理 on do /捕获指定类型的异常对象,进行处理,else /缺省的异常处理代码 end;,try语句

10、块指出了需要进行异常保护的代码。如果在这部分有不正常的事件发生,则引发一个异常对象。,except是异常处理部分,被保护部分引发的异常对象将执行或由这部分代码捕获并进行处理。,注意:运行时必须先编译生成exe文件,然后在Windows中运行,否则在发生异常时仍将出现系统的错误信息。,3.3.2 异常保护与try-finally语句,确保回收分配的资源是程序健壮性的一个关键。但缺省情况下异常发生时程序会在出错点自动退出当前模块,,因此需要一种特殊的机制来确保即使在异常发生的情况下释放资源的语句仍能被执行。而Delphi的异常处理正提供了这种机制。,1需要保护的资源 一般说来需要保护的资源包括:文

11、件、内存、Windows资源和对象。 由于程序从异常发生点退出,从而FreeMem永远没有执行的机会。,2创建一个资源保护块 一个设计良好的应用程序必须关闭或释放操作系统为应用程序分配的各种资源。即使在应用程序运行中产生了不正常的事件,也要保证系统资源的释放和关闭。,如应用程序运行过程中申请的内存资源,在应用程序结束前必须释放它,否则将会使内存丢失。,特别需要注意的是,不仅用户代码可能产生异常,许多运行时函数也可能产生异常。,一旦产生异常应用程序将被终止,这时可能出现分配的系统资源未被释放。使用try-finally语句可以有效地避免这种情况。,try finally语句的一般格式如下:,tr

12、y /try保护代码块 被保护语句 finally /异常处理块 异常处理语句 /无论异常发生否,都必须处理 end;,若用作创建一个资源保护块时,它的格式可写成:,(分配系统资源) try (使用系统资源的语句) finanlly (释放系统资源) end;,try前面的语句中包含了申请或创建系统资源的语句。,try部分包含了使用系统资源的代码语句。finally部分包含资源释放语句。,在应用程序运行过程中,如果在try部分产生异常情况,将直接跳过随后的代码,直接执行finally部分的资源释放语句。,如果不产生异常,则应用程序正常运行,最后执行finally部分中的资源释放语句。,注意:在

13、try-finally语句中,当try部分产生异常后,应用程序直接执行Finally部分的资源释放语句。,tryfinally结构与tryexcept结构在用法上主要有以下区别:,(1) 对于tryfinally结构来说,不管try部分的代码是否触发异常,finally部分总是执行的。,如果发生异常,就提前跳到finally部分。而对于tryexcept结构来说,只有当触发了异常后,才会执行except部分的代码。,(2) 在tryexcept结构中,当异常被处理后异常对象就被释放,除非重新触发异常。,而在tryfinally结构中,即使finally部分对异常作了处理,异常对象仍然存在。,(

14、3) finally部分不能处理特定的异常,因为它没有tryexcept结构中的异常句柄,无法知道确切的异常类型。,因此,在finally部分只能对异常作笼统的处理。,(4) 在tryfinally结构中,如果在try部分调用标准命令Exit、Break或Continue,将导致程序的执行流程提前跳到finally部分。,finally部分不允许调用上述三个命令。,3.3.3 异常的重引发和处理嵌套,由于异常在处理后即被清除,因而当希望对异常进行多次处理时就需要使用保留字raise 来重引发一个当前异常。,3.3.4 定义自己的异常,利用Delphi的异常类机制我们可以定义自己的异常类来处理程

15、序执行中的异常情况。同标准异常不同的是:,这种异常情况并不是相对于系统的正常运行,而是应用程序的预设定状态。,比如输入一个非法的口令、输入数据值超出设定范围、计算结果偏离预计值等等。,使用自定义异常需要: (1)自己定义一个异常对象类; (2)自己引发一个异常。,1定义异常对象类,异常是对象,所以定义一类新的异常同定义一个新的对象类型并无太大区别。,由于缺省异常处理只处理从Exception或Exception子类继承的对象,因而自定义异常类应该作为Exception或其它标准异常类的子类。,这样,假如在一个模块中引发了一个新定义的异常,而这个模块并没有包含对应的异常响应,,则缺省异常处理机制将响应该异常,显示一个包含异常类名称和错误信息的消息框。,下面是一个异常类的定义: type EMyException=Class(Exception);,2自引发异常 引发一个异常,调用保留字raise,后边跟一个异常类的实例。假如定义: type EPasswordInvalid=Class(Exception);,则在程序中如下的语句将引发一个EPasswordInvalid异常: If PasswordCorrectPassword then raise EPasswordInvalid.Create(Incorrect Pas

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号