Delphi 中的程序调试及异常处理
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译期错误
编译期错误也称为语法错误。在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)
格式3: Try
语句 Except
on [标识符:] 异常类 do 语句 on [标识符:] 异常类 do 语句 …………… else 语句 End;
功能:
当执行Try与Except之间的 语句发生异常时,依次查找 on后的异常类,直到发现某 个匹配的异常类即执行其do 后语句,若在on后没有找到 匹配的异常类,则执行else后 的语句,并清除异常。
设计期错误
这种错误类型发生在使用DelPhi进行可视化设计的时候,通常是 因为给组件的某个属性输入了非法的值。例如按钮组件TBitBtn的 NumGlyphs属性取值为 1..4,若输入的值不在此范围,则发生错误。
这一类型的错误较容易发现和纠正,因为DelPhi能对特定的值进 行合法性检查,发现这类错误,DelPhi将显示一个警告窗口,以提示 用户纠正错误。
Delphi程序设计
Delphi 中的程序调试及异常处理
程序调试 异常处理
程序调试
程序设计中的错误类型 设置编译选项 控制程序的执行 使用监视列表窗口(Watch List, Ctrl+F5) 使用求值/修改对话框(Evaluate/modify, Ctrl+F7)
程序设计中的错误类型
设计期错误 编译期错误 运行期错误 逻辑错误
举例
举例(格式3)
var i,j:integer; r:real; begin j:=20; try
i:=strtoint(edit1.Text); j:=10 div i; r:=10/(i-1); showmessage('正常,j='+inttostr(j)+',r='+floattostr(r)); //raise exception except on E:EConvertError do showmessage('异常,非数值'+#13+E.Message); else showmessage('异常,除数为0'); end; end;
运行期错误
程序虽然通过了编译,但运行失败,这种错误称为运行期错误, 例如应用程序试图打开一个不存在的文件,或者运算时出现被零除等 情况。
DelPhi能够检测出这类错误,并退出当前模块。此时,如果不能 确定错误发生在什么地方,可以用DelPhi内部集成的调试器查找错误 的位置。例如可以用单步执行命令,让程序一条语句一条语句地执行, 或者添加一个监视窗口,观察某个变量的变化情况。
编程实现符号函数的功能 : var x,y:real; begin x:=-2; y:=0; if x>=0 then
if x>0 then y:=1 else y:=-1; showmessage(floattostr(y)); end;
异常处理
Delphi对异常的自动处理 编程人员对异常的处理
字母 V
B
X T P H J
编译选项4
调试(Debugging)
选项
说明
字母
Debug
把调试信息放入单元文件(.DCU)里
Information
D
Local symbols 生成局域变量信息
L
生成符号索引信息。若此二项均被选中,编译器记
Reference Info 录下各标识符的定义位置,使代码浏览器工作。若 /Definitions 只有 Reference info 被选中,编译器记录下标识符 Y
例如: var
i:integer; r:real; begin
i:=0; r:=8 / i; showmessage(floattostr(r)); end;
Try…except语句(格式1)
格式1: Try
语句 Except
语句 End;
功能:
若执行Try与Except之间 的语句发生异常,则执行 Except与End之间的语句对该 异常作出处理,并清除异常, 否则(没有异常)跳过Except 与End之间的语句。
only
定义和使用位置的信息。除非 Debug information 和 Local symbols 都被选中,否则此二选项均无效
Assertions
在程序代码中插入断点代码
C
Use Debug DCUs 允许链接调试版本的 VCL
举例
举例(Range checking)
{$R+}或{$R-} var a:array [1..3] of byte; i:integer; begin for i:=1 to 4 do begin
W
自动生成检测错误浮点除法的代码
U
让变量地址都为 1,2,4,8 的整数倍数, 以提高 CPU 对内存访问的速度
A
编译选项2
运行时的错误(Runtime errors)
选项
说明
字母
Range checking I/O checking
检查数组或字符串类型的下标范围是否越界 R
在每次 I/O 调用后检查是会有 I/O 错误
if x>0 then y:=1 else y:=-1; showmessage(floattostr(y)); end;
设置编译选项
设置编译选项用来控制Delphi程序的编译方式。 可以使用如下二种方法进行设置: (1)使用Delphi菜单Project/Options--Compiler (2)在程序中加{$Z+}或{$Z-}设置或清除编译选项,其中Z为编译开 关字母。 建议,在程序调试时,将所有检查性的选项设置上,优化特性清 除,以利于调试;当程序调试通过后,应把那些加重程序时间、空间 负担的编译开关清除,设置优化代码功能,再编译一次pt后语句处理了异常,则清除异常,但可在其后使用Raise重新产生该异常,再提供给 外层Try来处理。
var i:integer; r:real; begin i:=0; try
r:=8/i; showmessage(floattostr(r)); except showmessage('除数为零'); raise; end;
write(f,'One string');//写入一个字符串,由于不能写,发生异常 finally
CloseFile(F); showmessage('文件已关闭'); end; end;
Delphi中的异常类
Delphi提供的所有异常类都是类Exception的子类。
常用异常类
EDivByZerO:整数被零除 。 EIntOverflow:整数超出其能表示的范围 。 EZeroDivide:浮点数被零除 Eoverflow:实数上溢出。 Eunderflow:实数下溢出。 ERangeError:访问数组时范围超出。
过程一样使用函数;同时也支持 Pchar 类型 使由@操作符返回的指针只与指向同类型变量的指针兼容
允许在过程及函数的声明中使用开放式的字符串参数 使关键字 String 对应新的 Ansistring 类型(否则只对应 Shortstring 类型) 编译器允许程序修改类型常量的值。此选项是为了兼容早期 的 DelPhi 和 Pascal 版本而设置的
Try…finally语句
格式: Try 语句 Finally 语句 End;
功能:
不管执行Try与Finally之 间的语句是否发生异常,均 可保证执行Finally后的语句, 它不清除异常。
通常用于在使用某资源时 失败后以保证能释放该资源。
举例
举例(Try…finally语句)
var f:textfile ;//定义文本类型的文件变量 begin assignfile(f,'c:\msdos.sys'); //文件变量f指向c:\msdos.sys文件 Reset(F);//文本文件以只读方式打开 try
a[i]:=i; showmessage(inttostr(a[i])); end; end;
控制程序的执行
设置断点(Toggle Breakpoint/F5) 执行到光标处(Run to cursor/F4) 单步执行(Trace Into/F7,Step Over/F8)
举例
举例(控制程序的执行)
Extended syntax Type @operator Open parameters Huge strings Assignable typed constants
说明 设置字符串参数的错误检查,要求形参与实参类型必须严格 一致(若 Open parameters 选项被选中,此项无效) 计算完逻辑表达式的所有项后计算整个逻辑表达式的值。当 不选此项,且逻辑表达式的值能确定时,后面的项就不计算 了。如无特殊要求此项通常不选 用 Delphi 的扩展语法,允许忽略函数的返回值,而像使用
语句 Except
on [标识符:] 异常类 do 语句 on [标识符:] 异常类 do 语句 …………… End;
功能:
当执行Try与Except之间 的语句发生异常时,依次查 找on后的异常类,直到发现 某个匹配的异常类即执行其 do后语句,并清除异常,然 后跳过Try与Except结构,执 行end后的语句。
逻辑错误
逻辑错误是指程序通过了编译,也能执行,但执行的结果跟预期 的不同。
逻辑错误有时比较难找,因为Delphi不能自动识别这类错误。这时 就需要用到内部集成的调试器,通过控制程序的运行、监视程序的输出 或观察变量的值,把错误逐步定位在一个较小的范围内。
举例
举例(逻辑错误)
编程实现符号函数的功能 : var x,y:real; begin x:=-2; y:=0; if x>=0 then
编译选项1
代码生成(Code generation)
选项
Optimization
Stack frames Pentium-safe FDIV Record field alignment
说明
字母
编译时启动优化功能:如把循环变量放入
CPU 的寄存器中,对重复出现的表达式只求 O
一次值等
强制编译器为每个过程和函数产生一个堆 找结构,这主要是为调试某些程序设置的
若在on后没有找到匹配的 异常类,则异常仍然存在。
举例
举例(格式2)
var i,j:integer; r:real; begin j:=20; try
i:=strtoint(edit1.Text); j:=10 div i; r:=10/(i-1); showmessage('正常,j='+inttostr(j)+',r='+floattostr(r)); except on E:EConvertError do showmessage('异常,非数值'+#13+E.Message); on EDivByZero do showmessage('异常,整数被0除'); on EZeroDivide do showmessage('异常,实数被0除'); end; end;