您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业财务 > 第7章 程序异常处理与调试技术
Delphi程序设计教程第7章程序异常处理与调试技术7.1异常处理7.1.1使用Try-Except语句处理异常7.1.2Try_Finally结构7.1.3异常基类及其属性和主要方法7.1.4Raise语句和异常处理的重引发7.2程序调试7.2.1调试的准备7.2.2控制程序的执行7.2.3使用断点7.3.4监视数据的值小结第7章程序异常处理与调试技术在Delphi中有两种程序错误,一种是编译错误,在程序编辑阶段就可以由编译器发现并给出提示。另外一种是运行错误,这类错误不能在编译阶段查出,只能在程序执行时发现,称为运行错误。Delphi提供了一种机制来处理运行错误,保护程序的正常执行,这种机制就是异常处理。异常处理的方法是把正常的执行程序同错误的处理程序分离开来,这样可以保证在没有错误时,程序正常执行,当发生错误时,执行错误处理部分的程序,然后程序跳出保护模块,继续执行后续的程序。7.1异常处理对于在应用程序中经常产生的异常,Delphi都进行了定义。如在SysUtils单元中定义了类型转换异常(EConvertError),数学异常(EMathError),输入输出异常(EInOutError)等;在ComCtrl单元定义了日期异常(EDateTimeError),在Db单元中定义了数据库异常(EDatabaseError),等。因此只需在单元中引用这些系统库单元就可以处理这些异常7.1.1使用Try-Except语句处理异常Try_Except的一般结构为:Try...//需要进行异常检测的语句序列Except...//发生异常时的错误处理模块End;//异常定义结束数学异常类在系统的SysUtils中声明,其定义形式为:typeEMathError=class(Exception);//由Exception类派生,是所有浮点数据错误的基类EInvalidOp=class(MathError);//无效的操作的指令EZeroDivide=class(MathError);/被零除EOverflow=class(MathError);//浮点数操作上溢EUnderflow=class(MathError);//浮点数操作下溢EinvalidArgument=class(MathError);//无效的参数End;一般有三种处理方式:1.不管发生什么异常,使用统一的错误处理方式Try…//需要检测的语句,例如可以是X:=Y/ZExceptHandleALLException;End;2.某些异常使用特殊的处理方式,而其余的异常使用统一的处理方式。对于一些可以预测的错误,使用更为详细的处理方式。例如:Try…ExceptOnEZeroDivideDoHandleZeroDivideError//处理被零除错误OnEOverflowDoHandleOverflowError//处理溢出错误OnEMathErrorDoHandleMathError//处理其他数学异常ElseHandleAllOtherError//前面没有被处理的异常则由该程序负责处理End;3.只检测某些错误异常,不管其他的异常情况。7.1.2Try_Finally结构Try_Fianally的一般结构为:Try…//需要保护的程序语句序列Finally…//一定执行的语句序列End;例如打开一个文件并进行处理,在处理完成后必须关闭文件。则可以使用类似下面的结构。VarTxtFile:TextFile;//定义文本文件变量存放打开的文件名字BeginIf(OpenDialog1.Execute)Then//使用文件打开对话框BeginTryAssignFile(TxtFile,OpenDialog1.FileName);//打开新选择的文件Append(TxtFile);//设置文件为追加方式Writeln(TxtFile,'异常检测的例子');//向文件中添加一行文本Flush(TxtFile);//保证新内容写入文件finallyCloseFile(TxtFile);//关闭打开的文件end;end;end;7.1.3异常基类及其属性和主要方法在Delphi中,所有异常的基类是Exception类。该类是所有其他异常类的祖先,即所有其他的异常类都是由该类派生而来。例如前面的EmathError类即是由该类派生而来。1.xception属性(1)Exception.HelpContext属性(2)Exception.Message属性2.exception方法(1)Exception.Create方法(2)Exception.CreateFmt方法(3)Exception.CreatHelp方法7.1.4Raise语句和异常处理的重引发除了使用前面介绍的Try_Except和Try_Finally结构来提交异常并进行处理外,Delphi中还可以使用Raise来提交异常,格式如下:RaiseObjectAtAddress【例7.1】异常处理的示例,使用Try_Except和Raise语句提交异常(1)界面设计(2)对象属性设置(3)程序设计FunctionStrToIntRange(constS:string;Min,Max:Longint):Longint;beginResult:=StrToInt(S);//StrToIntisdeclaredinSysUtilsif(ResultMin)or(ResultMax)thenraiseERangeError.CreateFmt('发生错误,%d不在%d..%d之内',[Result,Min,Max]);//由Raise提交异常end;functionbeInt(conststrVal:string):boolean;begintryStrToInt(trim(strVal));Result:=true;exceptResult:=false;//表示结果不正确raise;//再次提交异常异常重引发end;end;procedureTForm1.Button1Click(Sender:TObject);varx,y,z:single;beginy:=100;z:=0;//变量赋初值tryx:=y/z;showmessage(FloatToStr(x));//显示正确的结果exceptonEZeroDividedoshowmessage('除数为零!');//处理被零除错误elseshowmessage('发生错误!');//处理其他错误end;end;procedureTForm1.Button2Click(Sender:TObject);varPtr:pointer;//指针变量num:single;beginGetMem(Ptr,1024);//申请1024字节内存空间trynum:=StrToFloat('1234a');//产生转换错误FinallyFreeMem(Ptr,1024);//释放申请的内存空间End;end;procedureTForm1.Button3Click(Sender:TObject);beginStrToIntRange('100',0,99);//调用过程产生异常end;procedureTForm1.Button4Click(Sender:TObject);varSucStr,ErrStr,Str:string;beginStr:='123.234';ErrStr:=Str+‘不是一个有效的整数’;//错误提示字符串SucStr:='该整数是'+Str;//正确提示字符串tryif(BeInt(Str))ThenShowMessage(Pchar(SucStr))//显示正确信息exceptShowMessage(pchar(ErrStr));//报告发生异常显示错误信息end;end;(4)程序运行结果7.2程序调试Delphi提供了一个功能强大的内置调试器(IntegratedDebugger)来帮助对程序的运行状态进行跟踪和调试。该调试器可以方便的查找程序中出现的运行时间错误和逻辑错误。7.2.1.调试的准备调试的准备工作有下面几个方面:1.激活内置调试器要能对程序进行调试,首先必须使内置的集成调试器处于活动状态。方法是:在Delphi集成开发环境中,选中Tools|DebuggerOptions菜单General页的IntegratedDebugging复选框。缺省情况下该框被选中。2.设置编译和调试选项缺省情况下,Delphi对有些错误和信息不给出调试信息。可以改变Delphi的缺省设置。单击Project-Options菜单,选择Compiler页。如图所示。(1)RuntimErrors区域(2)Debugging区域(3)Messages区域3.编译程序发现编译错误在调试之前,必须先编译通过。可以选择Project-Complie工程名可以对工程进行编译,检测编译错误。也可以按Ctrl+F9执行同样的操作。缺省情况下,如果有错误或是警告和提示信息则显示在Message列表框中。7.2.2.控制程序的执行Delphi程序的调试命令都集中在RUN菜单下。可以三种方式进行调试:StepOver(F8)单步执行调试、TraceInto(F7)跟踪调试或使用RunToCursor(F4)运行到光标所在处。7.2.3使用断点断点(BreakPoint)就是使程序运行中断的点。在一个应用程序总可以设置多处断点,当程序运行到断点处,会暂停执行,等待进一步的命令。1.断点的设置有多种方法可以设置断点:(1)单击选定代码行左边的空白(2)在光标所在的行处按F5(3)使用Run|AddBreadpoint|sourcebreakpoint打开断点编辑对话框,在LineNumber处输入需要加断点的行号即可。2.断点的删除和设置(1)利用断点列表窗口可以快速找到断点在源代码中的位置。(2)断点功能的失效和恢复3.修改断点属性7.2.4监视数据的值1.监视表达式选择【View】→【DebugWindows】→【Watches】可以打开监视列表窗口【WatchList】。在该窗口中单击鼠标右键,在弹出的快捷菜单中选择【AddWatch】打开监视属性对话框,可以添加新的变量或表达式。如图所示。2.计算/修改表达式选择【Run】→【Evaluate/Modify】可打开计算/修改对话框。如图7-4所示。3.函数调用4.观测局部变量本章小结:本章主要有两个方面的内容。异常处理和程序调试。在异常处理中介绍了几种异常处理的方法,主要需要掌握的有Try-Except结构try_Finally结构,Raise语句的用法和异常的重引发。程序的调试重要有断点的设置及其属性修改,利用单步、跟踪调试技术调试程序。监测变量以及表达式的值。
本文标题:第7章 程序异常处理与调试技术
链接地址:https://www.777doc.com/doc-3373828 .html