- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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;
与
您可能关注的文档
最近下载
- 中英工程量计价比较.ppt
- unit 1 how can we become good learners 大单元教学+课时设计 section A (3a-4c).docx
- 博途-profinet技术讲解课件:Day2_2_2_PROFINETFunctions.pptx VIP
- 海南大学2022-2023学年《马克思主义基本原理概论》期末考试试卷(A卷)含参考答案.docx
- 2023华侨港澳台联考招生院校录取分数线.pdf
- PDC钻头优化设计与选型技术.pptx VIP
- 建筑设计公司岗位职责.pdf
- TCUPTA 004-2020 城市轨道TOD综合开发项目评价标准.docx
- 我国影视公司税务筹划分析—基于范冰冰逃税案的视角.docx
- 电力系统新能源弃电率的快速求解方法、系统、设备及存储介质.pdf VIP
文档评论(0)