第7章异常处理和程序调试技术.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第7章 异常处理与程序调试技术 本章重点 异常的概念 异常处理的语法 程序调试方法 第1节 异常处理概述 一、异常的概念 所谓异常是指程序在运行时遇到的一些无法预知,需要特别处理的状况。例如程序要打开一个不存在的文件、网络连接中断、操作数越界、装载一个不存在的类等问题。 二、Delphi的异常处理机制 Delphi提供了一套默认的自动异常处理机制,即当程序发生错误后会自动退出当前运行的程序模块,并以对话框的形式给出相应的错误信息,但是并不会引起应用程序的非法终止。 Delphi的异常处理机制是建立在保护块的概念上的。保护块是用保留字try和end封装起来的一段代码。当应用程序发生错误时,系统会自动创建相应的异常类的对象,该异常对象通常包含了错误的相关信息。程序可以捕获并处理这个异常对象,如果程序中没有定义对该异常的处理,则系统会自动产生一个消息框来描述这个错误,并保证程序不会非法终止。 三、异常类 在Delphi中,所有的异常类都派生自Exception类,该类是在SysUtils单元中定义的,如果一个程序的Uses语句中包含了SysUtils单元,则运行中发生错误时就会引发一个异常。 需要注意的是,异常不同于错误,编程者可以引发一个自定义异常。例如: Raise Exception.Create(My Error); 第2节 异常处理的语法 Delphi提供了两种处理异常的基本结构:try…except和try…finally。前者主要用于编写异常处理代码,后者主要用于保护系统资源。 一、try…except…end try…except…end形成一个异常响应保护块。正常情况下except后面的语句并不会被执行,而当一条或多条try块中的语句执行失败时,则发生异常,程序自动跳到except块中,进入异常响应处理模块中去执行。当异常被响应后异常类自动清除。 二、try…except on…do… end 这种异常响应保护块通过使用on…do来响应不同类型的异常,其中on之后为异常的类型。 例如: var I,J,K: Integer; begin Try I:=StrToInt(Edit1.Text); J:=StrToInt(Edit2.Text); K:=I div J; Edit3.Text:=IntToStr(K); Except On EDivByZero do ShowMessage(‘除数为0!); On EConvertError do ShowMessage(数据类型错误!); end; end; 说明: ① 如果未编写异常处理结构,当发生异常时,VCL将调用默认的异常处理程序,通常会显示一个消息框,显示与对应的异常有关的错误信息。 ② 即使为可能出现的异常编写了try…except结构,在Delphi开发环境中运行调试程序时,系统仍然会在出现异常的代码处中断程序运行(此时可执行菜单命令【Run | Program Reset】返回设计状态)。对于这样的程序,可先编译、保存,然后直接执行编译后的可执行文件。 ③ 父类异常可以对子类异常做出响应。例如,Exception类可以响应所有异常。如果在except块中含有多行on...do子句,应注意它们的继承层次关系。若各子句中的异常类之间存在直系继承关系,应将后代子句置前,祖先子句置后。否则,处于低层次的异常子类处理子句将不被执行。 三、try…finally…end 显示错误消息是异常处理的一个方面,当错误发生时,还应该保证系统的稳定,如及时释放已经分配的资源,避免系统的崩溃等,可以采用try…finally…end结构实现。Finally之后的语句无论如何都会被执行,因此可以用于资源保护。 例如,以下程序段存在缺陷: var P:Pointer; I,J:integer; Begin I:=0; GetMem(P,2048); //为指针P分配2K内存 J:=5 div I; FreeMem(P,2048); //释放为指针P分配的内存 End; 当运行到语句“J:=5 div I;”时,因I=0会产生被0除的异常。此时程序会从异常发生点退出当前程序块,FreeMem语句没有执行的机会,从而导致为指针P分配的内存未被释放。 采用try…finally…end结构可解决此问题: var P:Pointer; I,J:integer; Begin I:=0; GetMem(P,2048); Try J:=5 div I; Finally FreeMem(P,2048); End; End; 与

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档