第6章 Delphi程序异常处理与调试技术
delphi 教程
delphi 教程在此篇Delphi教程中,我们将介绍一些基本的Delphi编程知识。
Delphi是一种可视化的集成开发环境,用于创建Windows应用程序。
它支持面向对象编程,具有强大的图形用户界面设计工具和简化的应用程序开发工具。
首先,我们需要了解Delphi的安装和设置过程。
您可以从Embarcadero官网下载Delphi安装程序。
安装完成后,您可以根据需要配置Delphi的界面和选项。
接下来,让我们了解Delphi中的一些基本概念。
Delphi使用对象、类和单位的概念来组织代码。
对象是程序的实体,类是对象的模板,单位是一种将相关类和对象组织在一起的方式。
Delphi中的代码以过程和函数的形式组织。
过程是一段代码块,用于执行特定的任务,而函数是返回一个值的过程。
您可以使用Delphi的集成开发环境编写和编辑代码。
Delphi支持多种数据类型,包括整数、浮点数、字符和字符串。
您可以使用这些数据类型创建变量,并对其进行操作。
在Delphi中,您可以使用条件语句(如if语句和case语句)和循环语句(如for循环和while循环)来控制程序的执行流程。
这样,您可以根据条件执行不同的动作,或者重复执行一段代码。
Delphi还提供了丰富的图形用户界面设计工具。
您可以使用这些工具创建窗体和控件,并将它们放置在窗体上。
您可以使用属性编辑器更改控件的属性,并为控件添加事件处理程序,以响应用户的操作。
最后,让我们谈谈Delphi中的调试和错误处理。
Delphi提供了一些调试工具,可以帮助您查找和修复程序中的错误。
您可以使用调试器跟踪程序的执行过程,并在运行时查看变量的值。
您还可以使用异常处理机制捕捉和处理程序中的异常。
这就是本篇Delphi教程的简要概述。
通过学习这些基本概念,您将能够开始使用Delphi开发Windows应用程序。
希望这篇教程对您有所帮助!。
Delphi_程序设计基础教程_习题答案(hzd)
Delphi 程序设计基础教程第 1 章Delphi 集成开发环境1. 填空题(1) Delphi 是一个集成开发环境,从 3程序设计、代码编译、调试,到最布程序的全部工作都可以在这个集成环境中完成。
(2) 在 Delphi 集成环境的主要组成部分中有许多功能强大的工具,如: 3主窗体、对象树状视图、对象观察器、窗体设计器、代码编辑器工具等。
(3) Delphi 集成开发环境的界面分为4个部分,分别是。
主窗口、窗体窗口、代码编辑窗口和对象查看器窗口(4) 对象查看器的功能是:编辑设置窗体、组件的属性,并为窗体、组件添加事件的响应处理过程(5) Delphi 主窗口由:标题栏、菜单栏、工具栏和组件板组成,它是打开其他窗口和退出D elphi 集成环境的主要界面。
2. 选择题D(1) 对象查看器由组成。
A. 标题栏、菜单栏、属性标签和事件标签B. 标题栏、菜单栏、对象选择器和事件标签C. 标题栏、菜单栏、对象选择器和属性标签D. 标题栏、对象选择器、属性标签和事件标签D(2) Delphi 用来管理用户开发的应用程序中的各个文件,有序地管理可以极大地提高应用程序开发的质量和速度。
A. 单元B. 组件C. 属性D. 项目B(3) 用来编写应用程序的代码。
A. 调试器窗口B. 代码编辑窗口C. 报表生成器窗口D. 数据库桌面窗口B(4) 代码编辑窗口分为左、右两部分:。
A. 左边是单元代码窗口,右边是单元浏览器窗口B. 左边是单元浏览器窗口,右边是单元代码窗口C. 左边是单元调试窗口,右边是单元浏览器窗口D. 左边是单元浏览器窗口,右边是单元调试窗口A(5) 属性选项卡即标签名为“Properties”的选项卡,用于设置当前组件的属性,属性选项卡是一个两列的表格,。
A. 左列是属性标题,右列是属性值B. 左列是组件名称,右列是事件名C. 左列是属性标题,右列是事件名D. 左列是组件名称,右列是属性值C(6) 事件选项卡即标签名为“Events”的选项卡,用于为当前组件添加各种响应事件(如单击、拖曳事件等),它随对象选择器中的所选组件而发生变化。
第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异常处理机制
Delphi异常处理机制Delphi的异常处理⽅式有两种:try...except...end;try...finally...end;。
try...except主要⽤于捕获异常,只有出现异常的时候才会执⾏except部分。
try...finally主要⽤于资源释放,⽆论try语句块是否有异常都会执⾏finally语句块。
如下⾯的代码:tryraise exception.create('发现异常'); //在try语句块中抛出⼀个异常excepton e:Exception do//捕获异常beginshowMessage(e.message);end;end;⽤try..except是不会出现异常提⽰信息的对话框,需要⾃⼰主动去show出异常信息。
⽽try..finally.则会出现异常提⽰信息。
try..except和try..finally可以相互嵌套。
使⽤on e:Exception do可以精确处理特定的异常。
Exception是所有异常类的基类,Delphi内部就定义了处理常见异常的异常类(在SysUtils单元中),也可以从Exception继承定义⾃⼰的异常类使⽤raise语句可以抛出⼀个异常:EMyException=class(Exception)end;trytryraise EMyException.Create('我⾃⼰的异常');excepton e:EMyException doshowMessage(e.message);end;finallyshowMessage('我始终被执⾏');end。
异常处理与程序调试(三)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异常处理tryexcept语句和tryfin(精)
一、异常的来源在Delphi的应用程序中,下列的情况都比较有可能产生异常。
(1)文件处理(2)内存分配(3)Windows 资源(4)运行时创建对象和窗体(5)硬件和操作系统冲突二、异常的处理(1)try…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 中更加精确的捕捉异常。
使用on E:异常类do…结构可以在do体内处理特定异常类所抛出的异常。
四、异常的调试在Delphi IDE中,解除“Debugger Options”(可以使用菜单Tools—>Debugger Options…进行访问)中的Integrated Debugging复选框的勾选状态可以进行异常的调试。
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调试技巧
delphi调试技巧Delphi开发的调试技巧1、设置调试选项Delphi主菜单。
【Project】->【Options】,或单击工程管理器中的【Project Options】按钮。
显示Project Options,选择Complier<1>选中 Debug Information :把调试信息嵌入到DCU单元文件,会加大编译后的DCU文件,但不会影响最后生成的exe的大小和执行速度。
同时激活【Search】菜单中的【Find Error】命令。
当文件中包含调试信息并得到一个运行时错误(run-time error),记录下Delphi提供的16进制地址,在【Search】->【Find Error】中输入,Delphi将重新编译程序,并停留在产生错误的命令行。
<2>Local symbols:决定调试器能否看到在Implementation中定义的局部变量。
<3>Reference infoj选项/Definition Only选项是否产生应用程序中对象标识符的引用信息。
信息和对象代码存在dcu文件中,可以使用对象浏览器查看。
如果Definition Only 选项同时选中,编译器将生成标识符定义位置的信息,能够激活对象浏览器的Refenrence页。
如果不选,Dcu文件更小。
编辑器命令{$D} Debug Information{$L} Local Information{$Y} Symbol Information{$C} Assertions2、使用内部调试器<1> 命令行参数在【Run】->【Parameters】中设置<2>断点条件断点使源代码断点只有在满足某个条件时才有效。
在【View】->[Debug windows]->【BreakPoints】打开“BreakPoint List”对话框,右击断点,从弹出菜单中选择属性。
编程技术中的异常处理与错误调试技巧
编程技术中的异常处理与错误调试技巧编程是一门需要耐心和技巧的艺术。
在编写代码的过程中,经常会遇到各种各样的错误和异常情况。
如何处理这些异常和调试错误是每个程序员都需要掌握的重要技能。
本文将探讨编程技术中的异常处理与错误调试技巧。
一、异常处理异常处理是指在程序执行过程中出现错误或异常情况时,通过一定的方法和逻辑来处理这些异常,使程序能够正常运行或者给出相应的提示信息。
1. 异常的分类在编程中,异常可以分为两类:已知异常和未知异常。
已知异常是我们能够预见到的,比如除数为零、数组越界等;而未知异常是我们无法预见到的,比如网络连接中断、硬盘故障等。
2. 异常处理的方法异常处理的方法有很多种,常用的有try-catch语句、throw语句和finally语句。
try-catch语句用于捕获和处理异常。
在try块中编写可能会出现异常的代码,如果发生异常,就会跳转到catch块中执行相应的处理逻辑。
throw语句用于抛出异常。
当我们在代码中遇到某种异常情况时,可以使用throw语句主动抛出异常,并在调用该代码的地方进行相应的处理。
finally语句用于执行一些无论是否发生异常都需要执行的代码。
无论异常是否被捕获,finally块中的代码都会被执行,通常用于资源的释放和清理。
3. 异常处理的原则在进行异常处理时,有几个原则需要遵守。
首先,异常处理应该尽早地进行。
在编写代码时,应该尽量预见到可能出现的异常情况,并在可能的地方进行相应的处理,以避免异常的传递和扩散。
其次,异常处理应该具体明确。
在捕获异常时,应该尽量明确地指定捕获的异常类型,以便于针对不同的异常情况做出不同的处理。
最后,异常处理应该合理地使用。
异常处理不应该成为程序的主要逻辑,而应该作为一种辅助手段来处理异常情况。
过度使用异常处理可能会导致代码的可读性和可维护性下降。
二、错误调试技巧错误调试是指在程序运行过程中发现问题并进行排查和修复的过程。
良好的错误调试技巧可以帮助程序员快速定位和解决问题,提高工作效率。
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课件第6章
【例6.4】 在Tplane(父类)中声明虚拟方法Fly,在子类Tcopter和Tjet中覆
盖父类中的同名方法Fly。
Type
Tplane = class
procedure fly; virtual //声明虚拟方法
end;
然后,从Tplane派生出两个子类,Tcopter和Tjet:
Tcopter = class(Tplane)
对象变量 is 类名 如果返回值为True,那么对象变量是类或其派生类的一个实例。如 果对象为nil,返回值为false。在Windows程序设计中, 经常使用is运算 符判断组件的类型,例如:
For I:=0 to ComonemtCount-1 do
If Components[i] is Tedit then Tedit(Components[I]).Text:=‘’;
(1)定义构造方法的语句格式如下:
Constructor 构造方法名(参数表);
(2)实现构造方法的语法如下:
Constructor类名.构造方法名(参数表);
(3)调用构造方法的语句格式如下:
对象变量名:=类名.构造方法名(参数表);
3.析构方法 析构方法用来释放类的对象,并且释放对象中的其他数据 结构。在定义析构函数时,使用保留字Destructor,函数名通 常为Destroy。 (1)定义析构函数的语句格式为:
4.类方法 Object pascal中还有一种称为类方法的特殊方法,类方法 跟构造有些相似,其相似之处在于它们都能由类来引用,而不 必先创建一个对象实例,也就是说类方法不依赖于任何类的具 体实例。一般方法只能被类的实例调用,而类方法既可以被对 象实例调用,也可以被类本身引用。类方法只是表明这个方法 在逻辑上与这个类有联系。 类方法可以是过程,也可以是函数,类方法在类结构中定 义,与一般方法的区别是在关键Procedure或之前加一个Class 关键字。 例如:
基于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。
异常处理与调试技巧
异常处理与调试技巧异常处理和调试是软件开发中不可或缺的一部分,它们对于编写高质量的代码和确保程序的正常运行至关重要。
本文将详细介绍异常处理和调试的步骤和技巧,帮助读者更好地掌握这两个关键的开发技能。
I. 异常处理异常处理是指在程序运行过程中捕获和处理程序出现的异常情况,以保证程序的正常运行和用户体验。
以下是异常处理的步骤:1. 捕获异常:在代码中使用try-catch块来捕获可能出现异常的地方。
在try块中编写可能会抛出异常的代码,在catch块中编写异常处理逻辑。
2. 区分异常类型:根据捕获的异常类型来确定需要进行什么样的处理。
Java中的异常类型分为Checked Exception和Unchecked Exception,它们需分别进行不同的处理。
3. 适当处理异常:根据具体情况进行适当的异常处理,例如输出错误信息、记录日志、给用户提供友好的错误提示等。
4. 抛出异常:如果当前catch块无法处理异常,可以选择抛出异常并交给上层调用者处理,或者进行异常链的处理。
5. 最终处理:如果有必要,可以使用finally块来处理一些无论是否发生异常都需要执行的代码,例如释放资源。
II. 调试技巧调试是指通过检查和测试程序,定位和解决潜在的错误和问题。
下面是一些常用的调试技巧:1. 打印日志:使用日志记录框架(如Log4j)打印关键变量和方法的执行路径,帮助追踪程序的执行过程,并在程序出现问题时提供有力的线索。
2. 使用断点:在IDE中设置断点,可以暂停程序的执行并允许开发者逐行查看和分析代码。
通过观察变量的值和程序的运行流程,可以快速发现错误。
3. 单元测试:编写针对特定功能或模块的单元测试用例,在隔离环境中验证代码的正确性。
单元测试可以帮助发现和解决潜在的Bug,提高代码的质量。
4. 使用调试工具:现代的集成开发环境(IDE)通常提供强大的调试功能,如变量监视、堆栈跟踪、条件断点等。
开发者可以充分利用这些工具来深入分析代码的执行过程。
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 中更加精确的捕捉异常。
DELPHI源码调试方法(适合新手)
DELPHI源码调试方法(适合新手)Delphi调试概述除非你的程序只有几行,否则几乎不可能一次写成,因此调试就非常必要。
然而许多初学者不知道如何进行调试,写完程序就运行,发现结果不对再看代码,这样觉得非常吃力。
这里,简单介绍一下Delphi所提供的调试功能。
1.语法检查(Syntax Check)Delphi提供了语法检查的功能,这个功能和正常编译很相似,同样也会给出各类错误和警告信息,但是不会生成代码。
必须重视Delphi给出的任何信息,很多简单的错误就能够在这个阶段被发现。
Delphi的编译信息分为4类:Fault(故障),Error(错误),Warning(警告)和Hint(提示)。
Fault是指导致编译程序不能继续工作的错误,例如内存溢出等;Error是指发现用户程序不符合某些规定而导致不能按照用户程序的要求进行处理;Warning是指用户程序使用了某些不符合规定的形式,但是并不影响编译程序生成目标文件;Hint是指编译程序对用户程序的某些形式提出了怀疑。
前两类信息是必须要解决的,否则你不能运行你的程序,但是往往会有很多人忽略后两种信息。
然而,这些信息却是非常重要的。
对于下面这个代码,编译程序将会出现一个Warning:vara,b:Integer;begin...if a<100thenif a<b then begin...end;end.end.编译程序会告诉你,在“.”(句号)后面的内容被忽略了,实际上你会发现你漏了一个begin,同时将最后第二个end后面的“;”(分号)误写成“.”(句号)了。
再看看下面的代码:vara,b:Integer;beginb:=a+1;end;编译程序会给出一个Hint,告诉你a尚未被初始化,通常没有被初始化的变量其内容是不确定的。
由上可见,编译程序可以对你的程序进行初步的调试,协助你排除一些故障。
但是仅仅这样是完全不够的,需要更加强大的调试能力才能胜任更加复杂的程序调试任务。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第六章程序异常处理与调试技术在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负责提供用于格式化的数值。
(3)Exception.CreatHelp方法该方法的定义格式如下:Constructor CreateHelp(Const Msg:String; AhelpContsxt:Integer) ;该方法产生一个带有一条简单提示信息和上下文帮助序列号的提示对话框。
其中Msg参数包含了显示在异常对话框中的运行错误信息。
AhelpContext参数包6.1.1 Delphi内建的异常类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】|【Debugger Options】|【General】选项,然后取消【Integrated debugging】选项,这样才能看到异常处理的效果6.3.1 Try…Finally…End结构Try…Finally…End结构只需要触发异常,程序系统将自动捕捉被触发的异常,然后以信息对话框显示出异常的信息,让程序避开发生异常的程序代码,然后向下执行程序。
无论在“Try…Finaly”区内是否有异常被触发,都会接着执行“Findly…End”区的语句。
然而若是在“Try…Finally”区内有异常产生并被触发时,就会由异常发生点跳转此区域,转而执行“Finally…End”区的所有语句。
例:procedure Form1.Button1Click(Sender:TO b j e c t ) ;VarMyStringList:TStringList;beginMyStringList:= TStringList.Create;tryMyStringList.Assign(ListBox1.Items);…finallyMyStringList.Free;end;包括由程序系统自动触发以及程序员使用raise指令去触发的异常,故在本区可根据状况条件来使用Raise指令。
然而在本区使用raise指令,或者由程序系统自动触发某些异常时,程序系统并不一定会自动处理这些异常,这时程序就有可能会异常中断,因此需要“Except…End”区中捕捉异常,并且对异常作适当处理;也可仿照“Try…Finally…End”语法,在“Except…End”区对“Try…Except”区内被触发的异常作再次触发(Reraise)的操作,即再次使用Raise指令,由程序系统自动捕捉异常,以信息对话框显示出异常信息,然后让程序避开异常,而不致于中断程序。
6.3.2 “Except…End”区中的语句在“Except…End”区中,可以有多个语句,但此处主要是放置用来捕捉异常的语句,其目的是让程序仍自行捕捉异常,根据异常的类型决定要做的处理操作,而此种语句也有它特定的语法:On 异常对象标识符:类型 do //异常对象标识符可有可无语句;//(on identifier:type do statement)上述语法是表示当指定类型的异常被触发时,就执行保留字“do”后面这个语句。
反之若没有这种类型的异常被触发,则不会执行“do”后面的语句。
在捕捉异常的语句之后,还可以有一个“Else”区,在这个区域内可以有一般的语句(包括raise指令)。
若本区域内没有“Else”区域时,只要其内有捕捉异常的语句存在,就不允许有一般语句(包括raise指令);倘若本区内若有“Else”区,则除了“Else”区域之外,并不允许有一般语句存在于“Except…Else”区域,否则将导致编译错误。
6.4 程序调试Delphi提供了一个功能强大的内置调试器(Integrated Debugger) ,该调试器可以方便地查找程序中出现的运行时间错误和逻辑错误。
所谓运行时间错误是指程序能正常编译但在运行时出错。
逻辑错误是指程序设计和实现上的错误。
6.4.1调试的准备1.激活内置调试器方法是:在Delphi集成开发环境中,选中【Tools】|【Debugger Options】|【General】页的【Integrated Debugging】复选框。
默认情况下该框被选中。
2.设置编译和调试选项默认情况下,Delphi对有些错误和信息不给出调试信息。
可改变Delphi默认设置。
单击【Project】|【Options】|【Compiler】页。
(1)Runtime Errors区域Range checking:检查数组或是字符串的下标是否越界,默认时不检测。
I/O checking:检测输入输出错误,默认检测Overflow checking:整型操作溢出检测,默认不检测。
选中该复选框调试器将对整数运算是否溢出做检测,默认下不报告错误。
(2)Debugging区域设置调试的信息。
默认时几乎全部选中。
一般无须改变该区域的选项设置。
Debug information:表产生调试信息。
如果Debug Information 选中会在单元文件 (.dcu) 中放置调试信息,文件字节变大但不影响速度。
Local symbols:产生局部变量的调试信息。
Local Symbols选中会添加与所在类、过程、函数及对象方法中定义的标识符等有关调试信息。
在程序调试时调试器会使用这些信息,但这些信息不会添加到可执行文件中。
除非在【Project】|【Options】|【Linker】页面中选中【Include TD32 Debug Info】选项,选中了此选项就可以使用TD32来调试。
Reference info/Definitions only:用来产生供Code Browser, Code Explorer and Project Browser使用的标识符引用信息。
如果Reference Info和Definitions Only 都被选中,则编译器将记录标识符定义位置信息。
如果仅选中了 Reference Info,表示编译器不仅记录标识符定义的位置,同时将记录标识符被引用的信息。
如果不选中Debug Information 和 Local Symbols 选项,仅选中该选项将不起作用。
Assertions:产生断言的调试代码。
Use Debug DCUs:使用连接的Dcu文件作为调试路径。
必须在【Tools】|【Debugger Options】|【General】页中指定调试文件的路径。