第6章Delphi程序异常处理与调试技术概要.docx

上传人:b****6 文档编号:15724612 上传时间:2023-07-07 格式:DOCX 页数:11 大小:29.03KB
下载 相关 举报
第6章Delphi程序异常处理与调试技术概要.docx_第1页
第1页 / 共11页
第6章Delphi程序异常处理与调试技术概要.docx_第2页
第2页 / 共11页
第6章Delphi程序异常处理与调试技术概要.docx_第3页
第3页 / 共11页
第6章Delphi程序异常处理与调试技术概要.docx_第4页
第4页 / 共11页
第6章Delphi程序异常处理与调试技术概要.docx_第5页
第5页 / 共11页
第6章Delphi程序异常处理与调试技术概要.docx_第6页
第6页 / 共11页
第6章Delphi程序异常处理与调试技术概要.docx_第7页
第7页 / 共11页
第6章Delphi程序异常处理与调试技术概要.docx_第8页
第8页 / 共11页
第6章Delphi程序异常处理与调试技术概要.docx_第9页
第9页 / 共11页
第6章Delphi程序异常处理与调试技术概要.docx_第10页
第10页 / 共11页
第6章Delphi程序异常处理与调试技术概要.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

第6章Delphi程序异常处理与调试技术概要.docx

《第6章Delphi程序异常处理与调试技术概要.docx》由会员分享,可在线阅读,更多相关《第6章Delphi程序异常处理与调试技术概要.docx(11页珍藏版)》请在冰点文库上搜索。

第6章Delphi程序异常处理与调试技术概要.docx

第6章Delphi程序异常处理与调试技术概要

第六章程序异常处理与调试技术

在Delphi中有两种程序错误,一种是编译错误,在程序编辑阶段就可以由编译器发现并给出提示。

另外一种是运行错误,这类错误不能在编译阶段查出,只能在程序执行时发现,称为运行错误。

Delphi提供了一种机制来处理运行错误,保护程序的正常执行,这种机制就是异常处理。

异常处理的方法是把正常的执行程序同错误的处理程序分离开来,这样可以保证在没有错误时,程序正常执行,当发生错误时,执行错误处理部分的程序,然后程序跳出保护模块,继续执行后续的程序。

6.1ObjectPascal异常的种类

异常的种类:

Delphi内建的异常类,程序员自定义的异常类。

异常基类及其属性和主要方法:

在Delphi中,所有异常的基类是Exception类。

所有其他异常类都是由该类派生而来。

1.exception属性

 该类有两个基本属性:

HelpContext和Message。

(1)Exception.HelpContext属性

该属性的定义如下:

▪TypeThelpContext=-MaxLongint..MaxLongint;

▪PropertyHelpContext:

ThelpContext;

 HelpContext是ThelpContext类的一个实例,它提供了与异常对象联系在一起的上下文相关帮助信息的序列号。

该序列号决定当发生异常时用户按F1键显示的一个异常错误的帮助信息。

(2)Exception.Message属性

该属性的定义如下:

propertyMessage:

string

 该属性存储异常发生时的错误信息。

可以通过该属性在提示错误对话框中显示错误信息字符串。

2.exception方法

(1)Exception.Create方法

该方法的定义形式为:

ConstructorCreate(ConstMsg:

String);

 该方法用来产生一个带有一条简单提示信息的对话框,对话框中的提示内容由Msg提供

(2)Exception.CreateFmt方法

该方法的定义格式如下:

ConstructorCreateFmt(ConstMsg:

String;ConstArgs:

ArrayofConst);

 该方法用来产生一个带有格式化字符串提示信息的对话框,格式化的字符串由Msg和Args数组共同提供,其中数组Args负责提供用于格式化的数值。

(3)Exception.CreatHelp方法

该方法的定义格式如下:

ConstructorCreateHelp(ConstMsg:

String;AhelpContsxt:

Integer);

该方法产生一个带有一条简单提示信息和上下文帮助序列号的提示对话框。

其中Msg参数包含了显示在异常对话框中的运行错误信息。

AhelpContext参数包含一个限定异常错误信息上下文帮助序列号。

6.1.1Delphi内建的异常类

Delphi内建立异常类其标识符的第一个字母都是“E”,如此我们很容易就能辨认出此种类。

6.1.2自定义异常类

自定义的异常类必须继承内建的Exception类,或者继承Exception的某个子类才行。

除此之外,自定义异常类的语法和自定义一般类的语法并没有不同。

6.2触发异常的方法

触发异常的方法,主要可分为两种,一种是由程序系统自动触发,一种则是利用raise指令触发.

6.2.1由程序系统自动触发

只要属于Delphi内建类的异常产生时,程序系统就会在当下自动触发它们,并捕捉其信息,然后将异常的信息以对话框显示出来,这些是一般公认的异常状况,即使我们不对这些异常做处理,程序系统也会帮我们做处理,然后让程序再继续执行下去,这样程序就不会在当时异常中断,而出现意料之外的问题。

不过程序系统所作的只是一般的处理,通常仅是避开执行会发生异常的程序代码,而不会排除掉异常发生的原因。

故若保持原来的状态再做同样的执行操作,仍旧会触及同样的异常,却无法执行下一步的程序。

因此为了让程序执行更顺畅,并且让用户更容易使用我们所开发的应用程序。

即使是程序系统自动触发的异常,我们也应该主动去处理,设法去除导致异常的原因。

或者给予用户更明确,更人性化的提示,尽量不要让用户感到任何操怍上的困难,并且避免异常重复发生而浪费不必要的时间。

6.2.2使用raise指令触发

自行触发异常的方式.使用raise指令.其语法如下:

Raise异常对象实体

不要将raise指令当成一般语句使用,它必须配合异常处理语法来使用。

6.3处理异常情况

专门用来处理异常情况的语句主要有两种,一种是“try_except_end”结构,另一种则是“try_finally_end”结构。

由于Delphi在程序设计时,提供了调试器(Debugger),因此当程序执行时若发生异常状况,调试器将发挥功能,让程序在异常发生点,并且提示调试的方法,方便找出问题所在。

然而这样程序就无法如实展现异常处理的情况,而且这个应用程序若不在Delphi环境下执行,也不会有调试器存在。

因此在设计异常处理程序时,点选【Tools】|【DebuggerOptions】|【General】选项,然后取消【Integrateddebugging】选项,这样才能看到异常处理的效果

6.3.1Try…Finally…End结构

Try…Finally…End结构只需要触发异常,程序系统将自动捕捉被触发的异常,然后以信息对话框显示出异常的信息,让程序避开发生异常的程序代码,然后向下执行程序。

 无论在“Try…Finaly”区内是否有异常被触发,都会接着执行“Findly…End”区的语句。

然而若是在“Try…Finally”区内有异常产生并被触发时,就会由异常发生点跳转此区域,转而执行“Finally…End”区的所有语句。

例:

procedureForm1.Button1Click(Sender:

TObject);

Var

MyStringList:

TStringList;

begin

MyStringList:

=TStringList.Create;

try

MyStringList.Assign(ListBox1.Items);

finally

MyStringList.Free;

end;

end;

包括由程序系统自动触发以及程序员使用raise指令去触发的异常,故在本区可根据状况条件来使用Raise指令。

然而在本区使用raise指令,或者由程序系统自动触发某些异常时,程序系统并不一定会自动处理这些异常,这时程序就有可能会异常中断,因此需要“Except…End”区中捕捉异常,并且对异常作适当处理;也可仿照“Try…Finally…End”语法,在“Except…End”区对“Try…Except”区内被触发的异常作再次触发(Reraise)的操作,即再次使用Raise指令,由程序系统自动捕捉异常,以信息对话框显示出异常信息,然后让程序避开异常,而不致于中断程序。

6.3.2“Except…End”区中的语句

在“Except…End”区中,可以有多个语句,但此处主要是放置用来捕捉异常的语句,其目的是让程序仍自行捕捉异常,根据异常的类型决定要做的处理操作,而此种语句也有它特定的语法:

On异常对象标识符:

类型do//异常对象标识符可有可无

语句;//(onidentifier:

typedostatement)

 上述语法是表示当指定类型的异常被触发时,就执行保留字“do”后面这个语句。

反之若没有这种类型的异常被触发,则不会执行“do”后面的语句。

在捕捉异常的语句之后,还可以有一个“Else”区,在这个区域内可以有一般的语句(包括raise指令)。

若本区域内没有“Else”区域时,只要其内有捕捉异常的语句存在,就不允许有一般语句(包括raise指令);倘若本区内若有“Else”区,则除了“Else”区域之外,并不允许有一般语句存在于“Except…Else”区域,否则将导致编译错误。

6.4程序调试

Delphi提供了一个功能强大的内置调试器(IntegratedDebugger),该调试器可以方便地查找程序中出现的运行时间错误和逻辑错误。

所谓运行时间错误是指程序能正常编译但在运行时出错。

逻辑错误是指程序设计和实现上的错误。

6.4.1调试的准备

1.激活内置调试器

方法是:

在Delphi集成开发环境中,选中【Tools】|【DebuggerOptions】|【General】页的【IntegratedDebugging】复选框。

默认情况下该框被选中。

2.设置编译和调试选项

默认情况下,Delphi对有些错误和信息不给出调试信息。

可改变Delphi默认设置。

单击【Project】|【Options】|【Compiler】页。

(1)RuntimeErrors区域

Rangechecking:

检查数组或是字符串的下标是否越界,默认时不检测。

I/Ochecking:

检测输入输出错误,默认检测

Overflowchecking:

整型操作溢出检测,默认不检测。

选中该复选框调试器将对整数运算是否溢出做检测,默认下不报告错误。

(2)Debugging区域

设置调试的信息。

默认时几乎全部选中。

一般无须改变该区域的选项设置。

Debuginformation:

表产生调试信息。

如果DebugInformation选中会在单元文件(.dcu)中放置调试信息,文件字节变大但不影响速度。

Localsymbols:

产生局部变量的调试信息。

LocalSymbols选中会添加与所在类、过程、函数及对象方法中定义的标识符等有关调试信息。

在程序调试时调试器会使用这些信息,但这些信息不会添加到可执行文件中。

除非在【Project】|【Options】|【Linker】页面中选中【IncludeTD32DebugInfo】选项,选中了此选项就可以使用TD32来调试。

Referenceinfo/Definitionsonly:

用来产生供CodeBrowser,CodeExplorerandProjectBrowser使用的标识符引用信息。

如果ReferenceInfo和DefinitionsOnly都被选中,则编译器将记录标识符定义位置信息。

如果仅选中了ReferenceInfo,表示编译器不仅记录标识符定义的位置,同时将记录标识符被引用的信息。

如果不选中DebugInformation和LocalSymbols选项,仅选中该选项将不起作用。

Assertions:

产生断言的调试代码。

UseDebugDCUs:

使用连接的Dcu文件作为调试路径。

必须在【Tools】|【DebuggerOptions】|【General】页中指定调试文件的路径。

一般不选中该项。

(3)Messages区域

ShowHints:

使编译器产生提示信息。

例如检测在过程或函数中声明了但一直没有使用的变量信息,或者无效的引用信息等。

ShowWarnings:

使编译器产生警告信息。

3.编译程序发现编译错误

在调试之前,必须先编译通过。

可以选择【Project】|【Complie】<工程名>可以对工程进行编译,检测编译错误。

也可以按【Ctrl+F9】执行同样的操作。

默认情况下,如果有错误或是警告和提示信息则显示在Message列表框中。

6.4.2控制程序的执行

Delphi程序的调试命令都集中在RUN菜单下。

可以三种方式进行调试:

【StepOver(F8)】单步执行调试、【TraceInto(F7)】跟踪调试或使用、【RunToCursor(F4)】运行到光标所在处。

StepOver一次执行一行语句,碰到调用过程时也是一步就执行过去,不会跟踪到过程的内部代码中去逐行执行,TraceInto则是在碰到过程或函数时跟踪到它们的内部,可以对其内部代码进行调试。

RunToCursor则从当前运行位置直接运行到光标所在的位置如果光标所在的位置和当前运行位置处在不同的事件代码中,则不能直接运行到光标处,只有当发生了该事件才可以继续执行。

6.4.3使用断点

断点(BreakPoint)就是使程序运行中断的点。

在一个应用程序总可以设置多处断点,当程序运行到断点处,会暂停执行,等待进一步的命令。

1.断点的设置

(1)单击选定代码行左边的空白。

(2)在光标所在的行处按【F5】。

(3)使用【Run】|【AddBreadpoint】|【sourcebreakpoint】打开断点编辑对话框,在LineNumber处输入需要加断点的行号即可。

断点必须位于可执行代码行上,另外,断点既可以在设计状态下设置也可以在运行调试状态下设置。

一个有效(Enable)的断点默认的情况下该代码行显示为红色,正确的断点小圆点中是一个对号。

2.断点的删除和设置

删除一个断点,只要再次在已经设置为断点的代码行单击其左侧的空白处或按【F5】键就可以删除断点。

如果一个应用程序许多位置都设置了断点,则可以使用断点列表框来管理所有的断点。

 使用【View】|【Debug】|【breakpoints】打开断点列表框,列表框将列出应用程序中设置的所有断点,无效(Disable)的断点前面的标志为灰色。

在列表窗口中单击右键,将显示一个断点设置快捷菜单,使用该快捷菜单可以实现对断点的添加、删除、使有效以及无效等操作。

(1)利用断点列表窗口可以快速找到断点在源代码中的位置

(2)断点功能的失效和恢复

在断点列表窗口单击右键,在快捷菜单中取消对Enable的选择或选择【breakpoints】|【DisableAllBreakPoints】项可以使当前选中断点或所有断点失去功能。

快捷菜单中的【EnableBreakPoint】和【EnableAllBreakPoint】可以使相应断点恢复功能。

同样快捷菜单中的【DeleteBreakPoint】和【DeleteAllBreakPoint】可以删除当前选中断点或所有断点。

3.修改断点属性 

在断点列表窗口选择断点后单击右键,在弹出的快捷菜单中选择Properties,则打开断点编辑对话框,用于显示和修改断点属性。

也可以使用【Run】|【AddBreadpoint】|【sourcebreakpoint】打开该对话框。

利用该对话框可以改变断点的位置,设置断点条件。

断点条件包括两种:

布尔表示式和通过次数。

Condition编辑框用于设置布尔表达式条件。

如果表达式值为真(或非零)则程序运行在断点处中止;否则调试器将忽略该断点。

PassCount编辑框用于设置通过次数条件,即只有当程序运行在该断点处通过设定次数时程序运行才在该断点处中止。

  同时设置时,PassCount是指满足条件的通过次数。

6.4.4监视数据的值

1.监视表达式 

选择【View】|【DebugWindows】|【Watches】可以打开监视列表窗口WatchList。

在该窗口中单击鼠标右键,在弹出的快捷菜单中选择AddWatch打开监视属性对话框,可以添加新的变量或表达式。

也可以使用【Run】|【AddWatch】打开监视属性对话框。

在Expression右边的编辑框中添加要监测的变量或表达式,同时设置其属性。

当该表达式代表一个数据元素时,可以在Repeatcount中指定其重复次数。

如果要监测的是一个数组的值,可以使用Repeatcount指定数组元素的下标。

2.计算/修改表达式 

选择【Run】|【Evaluate/Modify】可打开计算/修改对话框。

当单击Evaluate按钮时,Expression编辑框中表达式的值显示在Result域中。

Expression中可以输入或选择任何合法的表达式(包括对象的属性),但不能包括;

(1)包含有当前执行点不能引用的局部或静态变量的表达式;

(2)函数或过程调用。

Expression中的表达式可以带特定的格式字符用于规定其显示格式。

其表示语法格式为:

变量名,格式字符串。

可使用的格式字符及其功能如下:

▪H,X:

以十六进制格式显示整型值

▪D:

以十进制格式显示整型值

▪C:

把ASCII码在0..31的特殊字等显示为ASCII码图形

▪Fn:

用n个有效数字显示浮点数

▪nM:

以十六进制方式显示一变量的内存转储值,n限定要显示的字节数。

▪P:

以段和偏移量格式显示指针。

两部分皆为四位十六进制值

▪Modify按钮可以修改特定表达式的值。

一般修改表达式的值常用于验证错误解决方案的正确性。

在Expression编辑框中输入欲修改的表达式,单击Evaluate按钮观察表达式的当前值。

而后在NewValue编辑框中输入或选中一个新值,单击Modify按钮确认并更新数据项。

但一般不要修改指针和数组下标

▪单击Watch按钮可以打开监视列表窗口,并添加选定的表达式到列表窗口中。

▪单击Inspect按钮可以为选择的数据元素打开一个信息的窗口,这对于观测数据结构、类和数组的值特别有用。

3.函数调用 

▪选择【View】|【DebugWindows】|【CallStack】可以显示调栈窗口(CallStackWindow)。

调栈窗口的顶端列出了应用程序最近的函数调用。

利用调栈窗口可以退出当前跟踪的函数,可以利用快捷菜单项显示或编辑位于特定函数调用处的源代码。

4.观测局部变量

▪当调试的程序位于某一个过程或函数内部时,可以选择View|DebugWindows|localvariables可以打开局部变量显示窗口。

该窗口显示在该过程或函数内部使用的所有局部变量及其值。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2