Delphi 讲义教程 第五章 程序调试与异常处理
Delphi 中的程序调试及异常处理

编译期错误
编译期错误也称为语法错误。在DelPhi中,通常是当程序代码违 反了object Pascal语言的语法规则时发生这类错误。比较常见的语法错 误有标识符未定义或拼写错误;语句的末尾漏掉分号;赋值语句中漏 写昌号;begin与end末配对;括号末配对;引号末配对等。
如果程序代码中有语法错误,编译不能通过,代码编辑器的状态 行将给出错误信息提示,并加亮有语法错误的代码行。
Try…except语句 Raise语句 Try…finally语句 自定义异常类及其使用
Delphi对异常的自动处理
Delphi为应用程序提供了一套缺省的自动异常处理机制,即当前 模块发生错误后退出当前模块并给出错误信息,而并不立即引起应用 程序的中止。 若程序在Delphi的集成开发环境中运行,在给出相应错 误信息的同时,还尽可能定位出错的位置。
I
Overflow checking 检查整数操作是否溢出
Q
信息(Messages)
选项 Show hints
说明 使编译器显示提示信息
Show Warnings
使编译器显示警告信息
编译选项3
语法选项(Syntax options)
选项 Strick var-strings
Complete Boolean eval
举例
举例(格式1)
举例: var i:integer; r:real; begin i:=0; try
r:=8/i; showmessage(floattostr(r)); except showmessage('除数为零'); end; end;
Try…except语句(格式2)
格式2: Try
Try…except语句(格式3)
第6章Delphi程序异常处理与调试技术.

第六章程序异常处理与调试技术在Delphi中有两种程序错误,一种是编译错误,在程序编辑阶段就可以由编译器发现并给出提示。
另外一种是运行错误,这类错误不能在编译阶段查出,只能在程序执行时发现,称为运行错误。
Delphi提供了一种机制来处理运行错误,保护程序的正常执行,这种机制就是异常处理。
异常处理的方法是把正常的执行程序同错误的处理程序分离开来,这样可以保证在没有错误时,程序正常执行,当发生错误时,执行错误处理部分的程序,然后程序跳出保护模块,继续执行后续的程序。
6.1 Object Pascal异常的种类异常的种类:Delphi内建的异常类,程序员自定义的异常类。
异常基类及其属性和主要方法:在Delphi中,所有异常的基类是Exception 类。
所有其他异常类都是由该类派生而来。
1. exception属性该类有两个基本属性:HelpContext和Message。
(1)Exception.HelpContext属性该属性的定义如下:▪Type ThelpContext= -MaxLongint..MaxLongint;▪Property HelpContext:ThelpContext;HelpContext是ThelpContext类的一个实例,它提供了与异常对象联系在一起的上下文相关帮助信息的序列号。
该序列号决定当发生异常时用户按F1键显示的一个异常错误的帮助信息。
(2)Exception.Message属性该属性的定义如下:property Message: string该属性存储异常发生时的错误信息。
可以通过该属性在提示错误对话框中显示错误信息字符串。
2.exception方法(1)Exception.Create方法该方法的定义形式为:Constructor Create(Const Msg: String);该方法用来产生一个带有一条简单提示信息的对话框,对话框中的提示内容由Msg提供(2)Exception.CreateFmt方法该方法的定义格式如下:Constructor CreateFmt(Const Msg:String;Const Args:Array of Const) ;该方法用来产生一个带有格式化字符串提示信息的对话框,格式化的字符串由Msg和Args数组共同提供,其中数组Args负责提供用于格式化的数值。
Delphi 第5章过程和函数解析

第十页,编辑于星期五:十七点 四十五分。
重载过程或函数使用默认参数可能会导致二义性错误。 如:
function f1(a:integer; b:integer=10); overload; begin
result := a + b; end; function f1(a:integer):overload; begin
过程和函数的区别主要在于过程本身没有返回值,而函 数有一个返回值。另外,在定义过程时使用保留字 procedure,而定义函数使用保留字function。
第一页,编辑于星期五:十七点 四十五分。
一、过程和函数的声明
1. 过程声明 procedure 过程名(参数表); <局部声明部分> begin
需在冒号之后声明函数返回数据类型。局部声明部分 与过程的局部声明部分类似。 函数名本身作为一个特殊的变量,与系统预先定义的变 量Result一样,可在函数体中接受赋值,用来存储函 数返回值。
第三页,编辑于星期五:十七点 四十五分。
过程和函数首部中声明的参数称为形式参数,简称形参。 形式参数,以及过程和函数局部声明的各种标识符(如 常量、数据类型、变量、过程、函数等)均为局部的, 即它们的作用范围只在该过程或函数中,在局部范围内 有效。全局标识符是在主程序中定义的,其作用范围在 主程序和子程序。由于任一被调用的子程序中可以随意 地访问全局变量,全局变量的数据缺乏可靠和安全,因 此,应尽量避免在子程序中直接访问全局变量,而是通 过参数来传递外部数据,进行间接访问。
第四页,编辑于星期五:十七点 四十五分。
二、过程和函数调用
如同标准过程和函数的调用一样,程序中可以 调用自定义的过程和函数。过程调用的形式是以 其作为一条单独的语句。
异常处理与程序调试(三)Delphi教程.

异常处理与程序调试(三)Delphi教程12.4.3 断点的使用12.4.3.1 设置断点设置断点首先在Code Editor中选定你想设置断点的代码行,而后进行如下的任一种操作:● 单击选定代码行左边的空白● 按F5 ● 选择Code Editor加速菜单的Toggle BreakPoint项● 选择Run|Add Breadpoint打开断点编辑对话框(Edit BreakPoint Dialog Box),而后选择New去确认一个新的断点设置或选择Modify去对一个存在的断点进行修改● 从BreakPoint List加速菜单中选择Add BreakPoint项断点必须位于可执行代码行上,凡设置在注释、空白行、变量说明上的都是无效的。
另外,断点既可以在设计状态下设置也可以在运行调试状态下设置。
12.4.3.2 断点的操作断点列表窗口(BreakPoint List Window)列出了所有断点所在的源文件名、行号、条件以及已通过的次数。
如果一个断点非法或失去功能,则在列表窗口中变灰。
断点列表窗口可以通过选择View|BreakPoint菜单打开。
断点列表窗口是断点操作的基础。
1.显示和编辑断点处的代码利用断点列表窗口可以快速找到断点在源代码中的位置。
首先选定断点而后从加速菜单中选择View Source或Edit Source。
此时Code Editor更新,显示该断点位置处的代码。
如果选择的是View Source,则断点列表窗口仍保持活动;如果选择的是Edit Source,则Code Editor获得输入焦点,可以在断点位置修改源代码。
2.断点功能的丧失和恢复使断点失去功能可以使断点从当前程序运行中隐藏起来。
假如你定义了一个断点当前并不需要,但可能在以后使用,则这一功能是很有用的。
断点列表窗口加速菜单的Disable BreakPoint和Disable All BreakPoints项可以使当前选中断点或所有断点失去功能。
Delphi应用程序的调试

Delphi应用程序的调试(一)集成式调试器是Delphi IDE的一个重要特性。
该调试器使用户能方便地设置断点、监视变量、检查对象等等。
在运行程序时,使用该调试器能快速查找出程序发生了什么(或未发生什么)。
一个号的调试器对程序开发的效率至关重要。
调试工作容易被忽略。
我也是刚开始学习Windows编程时,很长时间都未理睬调试器,因为当时忙于学习如何编写Windows应用程序。
当后来知道这是一个很有价值的调试器的后,才后悔为什么没有早点使用它。
希望大家从我的经历中吸取教训。
一、为什么使用调试器对于这个问题的回答很简单:调试器能帮助用户查找程序中的错误。
但是,调试过程不仅仅是查找错误,它还是一个开发工具。
尽管调试很重要,但仍有很多程序员不愿花时间来学习如何使用IDE调试器的各种性能。
结果,他们付出了更多的时间和精力,更不用提由于查不出程序中的错误而导致的失败。
可在调试器下启动程序,开始调试,也可按【F9】自动地使用调试器。
二、调试器菜单项在详细介绍调试器之前,先来看看有关调试器的菜单项目。
其中一些菜单项在主菜单的【Run】下,另一些在Code Editor的快捷菜单上。
1、Code Editor快捷菜单中的调试菜单项【Toggle Breakpoint】快捷键【F5】在Code Editor中的当前行上设置或关闭一个断点【Run to Cursor】快捷键【F4】启动程序并运行该程序至Code Editor中光标所在行【Goto Address…】快捷键【Ctrl + Alt + G】允许用户指定程序中的一个地址,程序在此地址恢复执行【Inspect…】快捷键【Alt + F5】为光标所在对象打开Debug Inspect窗口【Evaluate/Modify…】快捷键【Ctrl + F7】允许用户在运行时查看、修改变量【Add Watch at Cursor】快捷键【Ctrl + F5】将光标所指变量添加到Watch List中【View CPU】快捷键【Ctrl + Alt + C】显示CPU窗口主菜单上【Run】菜单项是一个下拉菜单,有若干菜单项与调试器下运行程序有关。
delphi异常和错误处理

异常和错误处理(基于Delphi/VCL)有人在看了我的“如何将界面代码和功能代码分离(基于Delphi/VCL)”之后,提到一个问题,就是如何对服务端的类的错误进行处理。
在基于函数的结构中,我们一般使用函数返回值来标明函数是否成功执行,并给出错误类型等信息。
于是就会有如下形式的代码:RetVal := SomeFunctionToOpenFile();if RetVal = E_SUCCESSED then......else if RetVal = E_FILENOTFOUND then......else if RetVal = E_FILEFORMATERR then......else then......使用返回错误代码的方法是非常普遍的,但是使用这样的方法存在2个问题:1、造成冗长、繁杂的分支结构(大量的if或case语句),使得控制流程变得复杂2、可能会有没有被处理的错误(函数调用者如果不判断返回值的话)而异常是对于错误处理的面向对象的解决方案。
它可以报告错误,但需要知道的是,并非由于错误而引发了异常,而仅仅是因为使用了raise。
在Object Pascal中,抛出异常使用的是raise保留字。
在任何时候(即使没有错误发生),raise都将会导致异常的发生。
异常可以使得代码从异常发生处立刻返回,从而保护其下面的敏感代码不会得到执行。
通过异常从函数返回和正常从函数返回(执行到函数末尾或执行了Exit)对于抛出异常的函数本身来说是没有什么区别的。
区别在于调用者处,通过异常返回后,执行权会被调用者的try...e xcept块所捕获(如果它们存在的话)。
如果调用者处没有try...except块的话,将不会继续执行后续语句,而是返回更上层的调用者,直至找到能够处理该异常的try...except块。
异常被处理后,将继续执行try...except块之后的语句,控制权就被留在了处理异常的这一层。
Delphi异常处理与程序调试(2)

Delphi异常处理与程序调试(2)12.3 异常响应异常响应为开发者提供了一个按自己的需要进行异常处理的机制。
try …except …end形成了一个异常响应保护块。
与finally不同的是:正常情况下except 后面的语句并不被执行,而当异常发生时程序自动跳到except,进入异常响应处理模块。
当异常被响应后异常类自动清除。
下面的例子表示了文件打开、删除过程中发生异常时的处理情况:uses Dialogs;varF: Textfile;beginOpenDialog1.Title := 'Delete File';if OpenDialog1.Execute thenbeginAssignFile(F, OpenDialog1.FileName);tryReset(F);if MessageDlg('Erase ' +OpenDialog1.FileName + '?',mtConfirmation, [mbYes, mbNo], 0) = mrYes thenbeginSystem.CloseFile(F);Erase(F);end;excepton EInOutError doMessageDlg('File I/O error.', mtError, [mbOk], 0);on EAccessDenied doMessageDlg('File access denied.', mtError, [mbOk], 0);end;end;end.保留字on…do用于判断异常类型。
必须注意的是:except后面的语句必须包含在某一个on…do模块中,而不能单独存在。
这又是同finally不同的一个地方。
12.3.1 使用异常实例上面所使用的异常响应方法可总结为如下的形式:on ExceptionType do{响应某一类的异常}这种方法唯一使用的信息是异常的类型。
Delphi 讲义教程 第五章 程序调试与异常处理.

2. 响应异常和try ... except ... end;语句该语句结构提供了一个可以根据需要进行自定的异常处理的机制。
其一般格式如下: try // 以下为保护代码块 if <异常条件> raise <异常对象> except // 以下为异常处理块 on <异常类1> do <处理过程1或语句1> // 捕获异常为异常类1的处理 on <异常类2> do <处理过程2或语句2> // 捕获异常为异常类2的处理on .….. else <其他处理过程或语句> // 该子句可以缺省end;
三、自定义异常类及其应用通过继承类exception,可以自定义新的异常类。
定义一个新异常的形式如下: type 异常类名 = class(Exception; 或者如下: type 异常类名 = class(Exception 类成员 // 数据域或方法 ... end;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. 语法错误 语法错误就是在编写程序代码时没有遵守 Object Pascal 语言的语法规则,在程序编译 时,只要有这种错误,Delphi的调试器就会自 动找出,并把出错的语句突出显示,同时在 代码编辑器的下方给出相应的出错提示。 2. 运行错误 程序语法正确,能正确编译,但程序在执行的 过程中发生了错误,这种错误称为运行错 误。遇到这种错误,操作系统会自动中止程 序的运行,并给出相应提示。
1. 异常保护与try ... finally ... end;语句 该语句的格式如下: try .….. // 被保护的代码块 finally .….. // 处理语句 end;
2. 响应异常和try ... except ... end;语句 该语句结构提供了一个可以根据需要进行自定的异常处理的机 制。其一般格式如下: try // 以下为保护代码块 if <异常条件> raise <异常对象> except // 以下为异常处理块 on <异常类1> do <处理过程1或语句1> // 捕获异常为异常类1的处理 on <异常类2> do <处理过程2或语句2> // 捕获异常为异常类2的处理 on .….. else <其他处理过程或语句> // 该子句可以缺省 end;
二、使用断点
Delphi的集成调试器可以让用户在程序 代码的某些行上设置标记,使程序执行 到这些行时暂停执行,这些标记就称为 断点。
1. 断点的设定与取消
在代码编辑器中,把光标移到某一行上,按
下 F5 键或用鼠标点击该行的左边区域,可以 为该行代码设断点。
在已设断点的行上重复以上所述设置断点的
本章学习要点
熟练并灵活地掌握各种调试和跟踪程序
的方法。
理解异常保护和处理编程的思想。 掌握异常处理的一般方法 掌握自定义异常类及使用
第五章 程序调试和异常处理
5.1 程序调试 5.2 异常保护和处理
5.1 程序调试
错误种类 使用断点 设置程序的执行方式 监视变量和相关数据的值
四、监视变量和相关数据的值
1. 提示文本 当程序暂停运行后,在代码编辑窗口中 把鼠标移到有关变量上,这时集成调试 器就会把该变量的值以一个提示文本 (Hint)的方式显示出来。
2. Watch List窗口 在调试程序的过程中,还可以利用 Watch List 窗口监视多个变量或表达式的值。选择执行 【View】→【Debug Windows】→ 【Watches】 菜 单 项 , 或 按 Ctrl+Alt+W 组 合 键,打开Watch List窗口。在Watch List窗口 中添加需要监视的对象。
三、自定义异常类及其应用
通过继承类exception,可以自定义新的异常类。 定义一个新异常的形式如下: type 异常类名 = class(Exception); 或者如下: type 异常类名 = class(Exception) 类成员 // 数据域或方法 ... end;
三、设置程序的执行方式
1. 单步执行 单步执行就是一次执行一行语句,当程 序遇到断点暂停后,可以选择这种方式 跟踪程序的执行。通过选择执行 【Run】→【Step Over】 菜 单 项 , 或 按下F8键实现程序单步执行。
2. 跟踪执行 跟踪执行和单步执行类似,只是当执行到含有过程或 函数调用的行后,执行点将进入过程或函数内部。 跟踪执行程序的方法是选择执行【Run】→【Trace Into】菜单项,或按下F7键。 3. 执行到光标所在处 如果希望程序在没有设置断点的行上暂停,可以把光 标 停 在 这 行 上 , 选 择 执 行 【Run】→【Run to Cursor】菜单项,或按下 F4 键,程序就会直接执行 到光标所在行上,然后暂停,等待用户作进一步操 作。
使断点有效与无效
在断点列表窗口中用鼠标右键单击所选的断 点,在弹出菜单中选取【Enable】项,使其 左方的 “ √ ” 出现(断点有效)或消失(断点 无效)。
设置断点条件
在断点列表窗口中右键单击所选的断点,在弹 出菜单中选取【Properties】项,在弹出的源 断点属性窗口上做出相应设置。
操作,则取消该行的断点设置。
断点必须设置在可执行的代码行上,如果把
断点设在注释、空行、变量声明等非执行行 上,调试器将认为该断点无效。
2. 设置断点属性 选 择 执 行 【View】→【Debug Windows】→ 【Breakpoints】菜单项,或按下 Ctrl+Alt+B 组合键,将打开断点列表窗口,窗口中包含 了所有断点信息。
异常的概念及异常类 异常保护期间产生的不可预料的错误 称为异常,它干扰正常的程序流程。存 在许多可能导致异常发生的情形,例 如,内存申请失败,浮点运算的溢出, 文件I/O的各种异常,以及打印异常等 等。
在SysUtils单元中定义的RTL异常类和在 Controls单元中定义的VCL异常类,都由 Exception类派生而来,在Exception类中定义 了进行异常处理的基本属性和方法。这些异 常类的定义,一方面归纳总结了Delphi应用程 序可能出现的异常,另一方面对异常进行了 内置的保护。
一、错误种类
编写程序时所出现的错误一般分为三 种:语法错误(Syntax Error)、运行 时期错误(Run-Time Error)和逻辑 错误(Logic Error)。这些错误都可 以通过Delphi开发环境所提供的强大的 集成调试器(Integrated Debugger)来 找出并修正。
在窗口的Expression编辑框输入变量名、对象属性或 表达式; 选取Evaluate按钮,则Expression中数据项的当前值 就显示在Result框中; 在 New Value 编辑框中输入新的值,选取 Modify 按 钮,则Expression中变量的值就被改成新输入的值。
5.2 异常保护和处理
二、异常保护和处理
Delphi提供了异常保护和处理的程序控制结 构。在保留字try与end之间的一段代码称为 保护块。在Delphi中,异常是一个对象,它 包含了异常的原因、位置和类型的信息。当 保护块内程序的运行发生异常时,将自动创 建一个相应的异常类对象,程序可以捕获这 个异常类对象,以确保程序的正常结束和资 源的释放,并可对异常做出响应,或调用系 统的默认处理过程。
3. 逻辑错误 逻辑错误是最难找的一种错误,表现为程序语法正 确,编译运行也没有出现任何异常,但程序运行后 产生的结果与编程者所设想的不一样。 一般从以下三点出发,发现程序执行到哪条语句开始 出错,从而找出错误根源。
猜测出程序可能出错的地方,并在此设置“断点”, 让程序执行到 “ 断点 ” 停止运行,观察所有中间变量 值及对象内容 让程序单步运行,同时观察每一个变量值及对象内 容的变化
3. Evaluate/Modify窗口 使 用 Evaluate/Modify 窗 口 查 看 或 修 改 数 据 的 步骤如 下: 选 择 执 行 【Run】→【Evaluate/Modify…】 菜 单 项 , 或 按 下 Ctrl+F7 组 合 键 打 开 如 图 5-13 所 示 的 Evaluate/Modify窗口;