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;。
第五章 调试与异常处理
Try-catch-finally 异常处理
try…catch…finally语句 [说明]: (1)当发生异常时,应寻找一个最佳的catch块。当异常发生时,选 择哪一个catch块将取决于异常的类型是否匹配,一个具体的catch 块将比一个公共的catch块优先。如在try块中发生了一个除数为0的 异常,有两个catch块,一个是捕获所有异常,一个是专门捕获除数 为0的异常,此时应执行“专门捕获除数为0的异常”的catch块。 (2)可以省略catch块。由于没有catch块,程序执行过程中发生异 常,如果有finally块则将直接执行该块中的代码,否则将直接中断。 (3)finally块也可以省略。但catch块和finally块不能同时省略。
异常处理机制
与switch语句的执行方式类似,找到第一个匹配的异常并处理后 将不再寻找匹配。 如果产生的异常未找到匹配,.NET运行库会捕获它。代码的执行 会立即中断,并给用户显示一个对话框,说明代码没有处理异常, 并给出.NET运行库能检索到的异常信息。 因此,应捕获尽可能多
的异常,并以合理的方式处理它们。
SystemException
从此处派生出 自己的异常类 IOException ArgumentNullException ArithmeticException ArgumentOutOfRangeException FileNotFoundException UnauthorizedAccessException DirectoryNotFoundException OverflowException EndOfStreamException FileLoadException
可以在catch块中使用无表达式的throw语句,在此情况下,该语 句会再次引发当前正由 Catch 语句处理的异常。 可以使用异常处理结构处理throw抛出的异常。
Delphi异常及异常处理
Delphi异常及异常处理
黄旭峰
【期刊名称】《铜仁学院学报》
【年(卷),期】2008(010)005
【摘要】本文针对Delphi编程工具生成的程式运行过程中所产生异常的来源、处理的方法进行说明.
【总页数】2页(P116-117)
【作者】黄旭峰
【作者单位】铜仁地区教育局,招生考试管理中心,贵州,铜仁,554300
【正文语种】中文
【中图分类】TP393.09
【相关文献】
1.浅谈Delphi异常处理 [J], 高亮
2.浅谈Delphi异常处理 [J], 高亮
3.MS_SQL Server 2000触发器引发的Delphi7.0的异常处理 [J], 赵雪松
4.MS_SQL Server 2000触发器引发的Delphi7.0的异常处理 [J], 赵雪松;
5.基于Delphi的异常处理实现方法 [J], 王平根
因版权原因,仅展示原文概要,查看原文内容请购买。
Delphi教程(完整版)
4.丰富的VCL
VCL是Delphi7最重要的组成部分,包含不
同种类的组件 。
A
18
1.2.4 帮助的使用
(1)当遇到问题时,可以尝试按下【F1】键, 一般情况下Delphi都会准确地定位。
(2)如果需要浏览系统的一些帮助内容,比 如说对象Pascal语言,可以通过菜单【Help】 |【Delphi Help】 命 令 打 开 【 帮 助 主 题 : Delphi Help】对话框,在目录标签中展开相 关条目,进行系统学习。
◆Delphi 4提供了Object Pascal语言的扩展 ,但 系统稳定性较差 。
◆1999年推出Delphi 5增强了数据库的功能
◆2001年6月推出Delphi 6 ,增加了大量的新 组件,使组件数目达350多个,以满足网络开 发的需要。
◆2002年8月推出 Delphi 7 ,在集成开发环境 IDE、Web、数据库、编译器、模型生成支持 及组件库等很多方面进行了改进
对象观察器类包括Properties选项卡和 Events选项卡
A
9
下图两个对象观察器,左边一个按种类排序, 右边一个按名字排序。
图1-5 按种类或名称查看Object Inspector
注意:帮助系统是和对象观察器紧密结合在一
起的,想了解某个属性或事件的帮助信息,
只要在该属性或事件上按下F1 键
A
20
(6)在Delphi集成开发环境中,通过【Help】 |【Customize】命令可以打开【Open Help】 窗口,在该窗口中可以对帮助文件进行管理, 其中包括帮助内容、帮助索引、链接位置和 帮助工程文件等的管理。
1.3 简单Delphi程序设计
Delphi 7编写应用程序包括新建应用程序、 设置窗体属性、添加组件、设置组件属性、 添加事件、编写事件响应代码、ows SDK】打开帮助文件Win32.hlp,在【索引】 选项卡中查找。
基于Delphi的异常处理实现方法
Science &Technology Vision科技视界0引言软件无论在测试中,还是常规运行时,都不可避免会发生由于软件设计、编码或操作人员非法操作,或者是数据库、网络线路等软硬件错误而引发应用程序异常。
在Delphi 的集成开发环境(IDE)中提供了一个完善的内置调试器,可以帮助你发现大部分程序错误。
但并不是所有的错误都可以被发现,而且当程序涉及到与外设的数据交换或操作外设,如要求用户输入、读写磁盘等时,错误的发生是程序无法控制的,如输入非法字符、磁盘不能读写等。
这些情况不仅回导致应用程序异常终止而且可能引起系统的崩溃。
针对这些问题,Delphi 同时提供了一套强大的异常处理机制。
巧妙地利用它,可以使你的程序更为强健,使用更为友好。
现本人结合实际,详细讨论Delphi 中异常处理及其实现方法。
1Delphi 异常处理机制Delphi 异常处理机制建立在保护块(Protected Blocks)的概念上。
所谓保护块是用保留字try 和end 封装的一段代码。
保护块的作用是当应用程序发生错误时自动创建一个相应的异常类(Exception)。
程序可以捕获并处理这个异常类,以确保程序的正常结束以及资源的释放和数据不受破坏。
如果程序不进行处理,则系统会自动提供一个消息框,告诉用户用处产生的原因,并终止程序的执行。
1.1异常类异常类是Delphi 异常处理机制的核心,也是Delphi 异常处理的主要特色。
Delphi 通过异常类Exception 来实现异常处理机制。
Exception 类是其它所有异常类的基类,其它异常类均是Exception 类的子类。
Exception 类定义在单元SysUtil 中,定义如下(对于不常用的成员没有列出):{SysUtil 单元中}Exception=class(Tobject)PrivateFmessage:Pstring;FhelpContext:Longint;Function GetMessage:String;Procedure SetMessage(const Value;String);Publicconstructor Create(const Msg:String);constructor CreateFmt (const Msg:String;const Args:array ofconst);…destructor Destroy;override;property HelpContext:Longint;property Message:String;property MessagePrt:Pstring;end;当然,用户也可以象定义其它类一样来定义自己的异常类。
DELPHI基础教程:异常处理与程序调试(二)[2]
DELPHI基础教程:异常处理与程序调试(二)[2]下面的代码同时使用了异常响应和异常保护异常响应用于设置变量的值异常保护用于释放资源当异常响应结束时利用raise重引发一个当前异常varAPointer: Pointer ;AInt ADiv: Integer;beginADiv := ;GetMem ( APointer )trytryAInt := div ADiv ;excepton EDivByZero dobeginAInt := ;raise;end;end;finallyFreeMem ( APointer )end;end;上面一段代码体现了异常处理的嵌套异常保护异常响应可以单独嵌套也可以如上例所示的那样相互嵌套自定义异常类的应用利用Delphi的异常类机制我们可以定义自己的异常类来处理程序执行中的异常情况同标准异常不同的是这种异常情况并不是相对于系统的正常运行而是应用程序的预设定状态比如输入一个非法的口令输入数据值超出设定范围计算结果偏离预计值等等使用自定义异常需要自己定义一个异常对象类自己引发一个异常定义异常对象类异常是对象所以定义一类新的异常同定义一个新的对象类型并无太大区别由于缺省异常处理只处理从Exception或Exception子类继承的对象因而自定义异常类应该作为Exception或其它标准异常类的子类这样假如在一个模块中引发了一个新定义的异常而这个模块并没有包含对应的异常响应则缺省异常处理机制将响应该异常显示一个包含异常类名称和错误信息的消息框下面是一个异常类的定义typeEMyException = Class(Exception) ;自引发异常引发一个异常调用保留字raise 后边跟一个异常类的实例假如定义typeEPasswordInvalid = Class(Exception)则在程序中如下的语句将引发一个EPasswordInvalid异常If Password <> CorrectPassword thenraise EPasswordInvalid Create( Incorrect Password entered )异常产生时把System库单元中定义的变量ErrorAddr的值置为应用程序产生异常处的地址在你的异常处理过程中可以引用ErrorAddr的值在自己引发一个异常时同样可以为ErrorAddr分配一个值为异常分配一个错误地址需要使用保留字at 使用格式如下raise EInstance at Address_Expession;自定义异常的应用举例下面我们给出一个利用自定义异常编程的完整实例两个标签框(Label Label )标示对应编辑框的功能编辑框PassWord和InputEdit用于输入口令和数字程序启动时Label InputEdit不可见当在PassWord中输入正确的口令时Label InputBox出现在屏幕上此时Label PassWord隐藏设计时令Label InputEdit的Visible属性为False 通过设置PassWord的PassWordChar可以确定输入口令时回显在屏幕上的字符自定义异常EInvalidPassWord和EInvalidInput分别用于表示输入的口令非法和数字非法它们都是自定义异常EInValidation的子类而EInValidation直接从Exception异常类派生下面是三个异常类的定义typeEInValidation = class(Exception)publicErrorCode: Integer;constructor Create(Const Msg: String;ErrorNum: Integer)end;EInvalidPassWord = class(EInValidation)publicconstructor Create;end;EInvalidInput = class(EInValidation)publicconstructor Create(ErrorNum: Integer)end;EInValidation增加了一个公有成员ErrorCode来保存错误代码错误代码的增加提供了很大的编程灵活性对于异常类可以根据错误代码提供不同的错误信息对于使用者可以通过截取错误代码在try…except模块之外来处理异常从以上定义可以发现 EInvalidPassWord和EInvalidInput的构造函数参数表中没有表示错误信息的参数事实上它们保存在构造函数内部下面是三个自定义异常类构造函数的实现代码constructor EInValidation Create(Const Msg: String; ErrorNum: Integer)begininherited Create(Msg)ErrorCode := ErrorNum;end;constructor EInValidPassWord Create;begininherited Create( Invalid Password Entered )end;constructor EInValidInput Create(ErrorNum: Integer)varMsg: String;begincase ErrorNum of:Msg := Can not convert String to Number ;:Msg := Number is out of Range ;elseMsg := Input is Invalid ;end;inherited Create(Msg ErrorNum)end;对于EInvalidInput ErrorCode= 表示输入的不是纯数字序列而ErrorCode= 表示输入数值越界lishixinzhi/Article/program/Delphi/201311/25189。
Delphi程序设计教程 教学课件 作者 吴文虎 等 05-大学课件-
5.3 组件开发技术
5.3.3 开发自定义组件的具体步骤
1 确定祖先类。通过前面的学习,我们明白了VCL的层次结构,由此也就知道了 ,其实每一个可视组件都有其父类的。所以在开发可视组件时,先要确定它 的父类(也叫祖先类)。
2 创建组件的单元文件。组件的具体实现是放在一个单元文件里,在这个单元 文件里定义了组件的属性、方法、事件及具体实现。
end; procedure TForm1.Button1Click(Sender: TObject); begin
…… end; procedure TForm1.Button1Click(Sender: TObject); begin Button2.onclick:= Button1Click; End;
5.1 VCL的层次结构
5.1.3 VCL的通用属性、方法和事件
(2)VCL组件的方法
Type Tmytry=class Male: Boolean; Gender: string; Procedure Judgethegender;
end; Procedure Tmytry.Judgethegender; Begin
If male then Gender:=’I am a man’;
Else Gender:=’I am a woman’;
end;
5.1 VCL的层次结构
5.1.3 VCL的通用属性、方法和事件
(3)VCL组件的事件
type TForm1 = class(TForm) button1: Tbutton; button2: Tbutton; procedure TForm1.Button1Click(Sender: TObject); procedure TForm1.Button2Click(Sender: TObject);
Delphi_异常处理_详解(全)
Delphi_异常处理 _详解 (全 .txtDelphi 异常处理详解[1] Exception类的定义在 SysUtils 单元中。
[2] Delphi也支持不从 Exception 继承的异常类,但是我觉得这么做并不十分的明智。
一、异常的来源在 Delphi 的应用程序中,下列的情况都比较有可能产生异常。
(1文件处理(2内存分配(3 Windows 资源(4运行时创建对象和窗体(5硬件和操作系统冲突二、异常的处理(1 t ry…except…end;在 try 体内的代码发生异常时,系统将转向 except 部分进行异常的处理。
这是Delphi 处理异常的最基本的方式之一。
(2 try…finally…end;这种异常处理结构一般用于保护 Windows 的资源分配等方面, 它确保了无论try 体内的代码是否发生异常,都需要由系统进行最后的统一处理的一些 Windows 对象的正确处理。
和try…except…end 不同,该结构的 finally 部分总被执行。
(3不存在try…except…finally…end 结构来既处理异常,又保护资源分配的结构,但是, try…except…end 结构允许嵌套到try…finally…end 结构中,从而实现既处理异常,又保护资源的分配。
三、异常的精确处理(1定义一个异常。
在 Delphi 中,每个异常都是 Exception[1]类的一个派生类 [2]。
因此,定义一个异常就是定义一个 Exception 类的派生类。
type EMyException = class(Exception;当然,基类可以是 Exception 或者 Exception 的任何一个任何层次的派生类。
(2在程序中抛出一个异常。
根据不同的情况抛出异常是使用异常的最基本的模式。
在 Delphi 中,由 raise 语句来实现。
【语法】 raise 异常类.Create(… 异常的缺省说明‟;(3在try…except…end 中更加精确的捕捉异常。
第5章Delphi教程
InputBox对话框
1.格式 InputBox函数的格式如下:
function InputBox(const ACaption, APrompt, ADefault: string): string;
InputBox函数有三个参数,它们均为字符 串类型,各参数含义如下: • ACaption:设置对话框的标题。 • APrompt:设置对话框中的提示信息,如图 5-1中的“请录入数据:”。 • ADefault:打开对话框时,在对话框的Edit 组件中显示的默认字符串,如上图中的 “Default”。 当在输入对话框中输入数据,单击OK按钮 后,InputBox函数会将输入的数据以函数返回 值的形式发送给程序;单击Cancel按钮或者按 Esc键时,InputBox函数会将默认字符串传送给 程序。
Flags参数值的含义
Flags取值 MB_ABORTRETRYIGNORE MB_OK MB_OKCANCEL MB_RETRYCANCEL MB_YESNO MB_YESNOCANCEL 含义 对话框中有三个按钮:放弃、重试、忽略 对话框中有一个默认按钮:确定 对话框中有两个按钮:确定、取消 对话框中有两个按钮:重试、取消 对话框中有两个按钮:是、否 对话框中有三个按钮:是、否、放弃
function InputQuery(const ACaption, APrompt: WideString; var Value: Integer, Min: Integer ; Max: Integer ; Increment: Integer): Boolean; overload;
重载后的InputQuery函数的参数与重载后的 InputBox函数的参数大致相同。 下面给出一个使用重载InputQuery函数实现 输入浮点数的例子。
- 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窗口;