delphi 异常

合集下载

基于Delphi的异常处理实现方法

基于Delphi的异常处理实现方法

基于Delphi的异常处理实现方法【摘要】本文重点介绍了Delphi对异常处理的机制;针对程序运行过程中产生的异常情况,运用Delphi开发工具并结合实例介绍了异常处理机制在程序设计中对异常处理的实现方法。

【关键词】Delphi;异常处理;保护块;异常类0 引言软件无论在测试中,还是常规运行时,都不可避免会发生由于软件设计、编码或操作人员非法操作,或者是数据库、网络线路等软硬件错误而引发应用程序异常。

在Delphi的集成开发环境(IDE)中提供了一个完善的内置调试器,可以帮助你发现大部分程序错误。

但并不是所有的错误都可以被发现,而且当程序涉及到与外设的数据交换或操作外设,如要求用户输入、读写磁盘等时,错误的发生是程序无法控制的,如输入非法字符、磁盘不能读写等。

这些情况不仅回导致应用程序异常终止而且可能引起系统的崩溃。

针对这些问题,Delphi同时提供了一套强大的异常处理机制。

巧妙地利用它,可以使你的程序更为强健,使用更为友好。

现本人结合实际,详细讨论Delphi中异常处理及其实现方法。

1 Delphi异常处理机制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 of const);…destructor Destroy;override;property HelpContext:Longint;property Message:String;property MessagePrt:Pstring;end;当然,用户也可以象定义其它类一样来定义自己的异常类。

基于Delphi的异常处理实现方法

基于Delphi的异常处理实现方法
in f ll a y
/ / 这将触发异常 , , 释放先前分配 的内存
F r e e M e m ( p P o i n t e r . 1 0 2 4 ) ;
2 。 4 I 科技视界 s c i e n c e & c h n 。 。 g y V i s i 。 n
, 觖省 的 异 常 处 理 代 码 。 。
d e s t r u c t o r De s t r o y ; o v e r r i d e ; p r o p e r t y He l p Co n t e x t : L o n g i n t ; p r o p e ty r Me s s a g e : S t r i n g ; p r o p e r t y Me s s a g e P t: r P s t r i n g ; e n d ;
常, 大多数异常是不 明确异常 , 这样的处理可能并不符合用户的要求 ,
因此 D e l p h i 提供 了按照 自己的需要进行异常处理的机制 . 即用 t r v 和 e n d 封装一段程序代码 其格式为 : t r v / / t r y保护代码 块 被保护语句 e x c e p t / / 异常处理块 异常处理语句 , / 异常不发生. 不处理




法字符 、 磁盘不能读写等。这些情况不仅回导致应用程序异常终止而且 一 一 …
常 处 鬯 理 至 机 制 统 婆 : , 这 兰 要 D e l — p h i 日 寸 使用更为友好。 = 巧妙地利用它 , 可以使你的程序更为强健 ,

~ 语 句 + 1 > . , 。
科技・ 探索・ 争鸣
S c 科 i e n c e & 技 T e c h 视 n o l o g y 界 V i s i o n

Delphi异常处理机制

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异常处理tryexcept语句和tryfin(精)

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中或者EmbeddedWebBrowser控件打开部分网站报“Invalid floating point operation”异常

Delphi中或者EmbeddedWebBrowser控件打开部分网站报“Invalid floating point operation”异常
来关闭这个机制. 你可以加在form的OnCreate事件里。
虽然问题解决了,不过不明白为什么,求高人指点。
参考:
《TWebbrowser打开paypal出错》/s/blog_48d1e7820100e1yw.html
Delphi中WebBrowser(或者Embபைடு நூலகம்ddedWebBrowser)控件打开部分网站报“Invalid floating point operation”异常的解决方法
最近用EmbeddedWB控件做浏览器相关应用的时候,发现有些网页只要一打开就一定会蹦出一个“Invalid floating point operation”异常(关掉异常对话框以后,浏览器无响应),而程序仅仅是一句
?WebBrowser1.Navigate(Edit1.Text);
貌似很多含有Silverlight元素的网页打开时都会带出这个bug。而且关键是,错误提示完全让人摸不着头脑有木有!!!!!
百思不得其解,遂Google之,得结论如下:
1、很多网友都遇见过同样的问题
2、Borland官方解释请点这里(我这打不开)
3、大概的情况是,在使用一些浮点操作时,微软默认设计会抛出一系列的异常。这些异常按理说不应该阻止程序运行。但不知道为什么,Delphi默认是截获后又把异常抛了出来,被系统截获就会影响程序运行了。Borland给的解决方法是,加一句
?Set8087CW(Longword($133f));

delphi异常和错误处理

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块之后的语句,控制权就被留在了处理异常的这一层。

exited with code 9009 delphi编译

exited with code 9009 delphi编译

"Exited with code 9009" 是一个错误信息,通常在 Delphi 编译过程中出现。

这表示 Delphi 编译器在尝试编译代码时遇到了问题,导致编译过程提前终止。

错误代码 9009 是一个特定的退出代码,用于指示 Delphi 编译器遇到了一个错误或异常情况。

这可能是由于多种原因,例如:
1.代码中存在语法错误:例如,拼写错误、丢失分号、括号不匹配等。

2.使用了不支持的 Delphi 语言特性或库。

3.项目设置或环境配置不正确。

4.Delphi 编译器本身的问题或 bug。

为了解决这个问题,你可以尝试以下方法:
1.检查代码中的语法错误,确保代码是正确的。

2.检查项目设置和环境配置,确保一切都设置正确。

3.更新 Delphi 编译器到最新版本,或尝试使用其他版本的 Delphi。

4.在网上搜索错误代码 9009,看看是否有其他开发者遇到了同样的问题,并
找到了解决方案。

5.如果问题仍然存在,你可以尝试联系 Delphi 的技术支持或社区,寻求帮助
和指导。

delphi异常类

delphi异常类
301 系统接收了一个无效的操作锁定确认。
302 此卷太碎,不能完成这个操作。
303 不能打开文件,因为它正在被删除。
487 试图访问无效的地址。
534 算术结果超过 32 位。
535 管道的另一有一进程。
536 等候打开管道另一端的进程。
994 拒绝访问扩展属性。
995 由于线程退出或应用程序请求,已放弃 I/O 操作。
1081 这个服务所运行的处理和服务控制管理器相同。 所以,如果服务处理程序意外中止的话,服务控制管理器无法进行任何操作。
1082 这个服务尚未设置恢复程序。
1083 配置成在该可执行程序中运行的这个服务不能执行该服务。
1084 不能以安全模式开始这项服务
1100 已达磁带的实际结尾。
209 正在发送的信号不正确。
210 无法设置信号处理程序。
212 段已锁定且无法重新分配。
214 连到该程序或动态链接模块的动态链接模块太多。
215 无法嵌套调用 LoadModule。
230 管道状态无效。
231 所有的管道范例都在使用中。
232 管道正在被关闭。
233 管道的另一端上无任何进程。
1074 系统当前以最新的有效配置运行。
1075 依存服务不存在,或已被标记为删除。
1076 已接受使用当前引导作为最后的有效控制设置。
1077 上次启动之后,仍未尝试引导服务。
1078 名称已用作服务名或服务显示名。
1079 此服务的帐户不同于运行于同一进程上的其他服务的帐户。
1080 只能为 Win32 服务设置失败操作,不能为驱动程序设置。
1065 指定的数据库不存在。

delphi out of memory解决方法

delphi out of memory解决方法

delphi out of memory解决方法"Delphi out of memory" 错误通常是由于应用程序占用了过多的内存,导致系统无法分配更多的内存。

以下是一些可能的解决方法:优化代码:检查你的代码,看看是否有任何可以优化的地方。

这可能包括减少对象实例化,避免在循环中创建大量对象,或者确保及时释放不再需要的对象。

使用Delphi的垃圾收集机制可以帮助管理内存。

使用更小的数据类型:如果可能,尽量避免使用大型的数据类型。

例如,使用数组代替集合,使用字符串列表代替字符串数组等。

内存管理:确保在不再需要对象时正确地释放它们。

使用 Free 或Dispose 来释放对象。

使用更大的内存空间:如果可能,尝试增加可用内存。

这可能需要在操作系统级别进行配置,或者使用更大的数据类型或数组。

检查第三方库:如果你使用的第三方库有可能,尝试更新到最新版本,或者寻找其他可能更有效的库。

分析内存使用:使用Delphi的调试工具或其他内存分析工具来找出内存泄漏或其他问题。

考虑使用64位Delphi:如果你的应用程序需要大量的内存,考虑使用64位版本的Delphi。

这将使你可以访问更多的内存。

优化图形和多媒体资源:如果你在应用程序中使用了大量的图形或多媒体资源,尝试优化这些资源的大小和数量。

考虑数据库和网络操作优化:如果你的应用程序经常进行数据库操作或网络通信,尝试优化这些操作以减少内存使用。

测试在各种环境下的表现:在不同的操作系统和硬件配置上测试你的应用程序,看看是否有特定的环境下内存问题更严重。

记住,解决 "Delphi out of memory" 错误可能需要一些时间和耐心,因为可能需要对代码进行一些修改和测试。

delphi try用法

delphi try用法

delphi try用法Delphi中的try用法是用于处理异常的一种机制。

在编写程序时,无法预料到的错误可能会导致程序异常甚至崩溃,而try块可以帮助我们优雅地处理这些异常情况。

try块主要由try、except和finally这三个关键字组成。

try块内包含可能会引发异常的代码片段,而except块则用于捕获这些异常并进行相应的处理。

最后,finally块中的代码将会无论是否发生异常都会被执行。

在使用try块时,我们可以根据需要书写多个except块,用于捕获不同类型的异常。

在每个except块中,我们可以编写处理异常的代码,例如打印错误信息、给用户友好的提示、进行日志记录等操作。

除了捕获异常外,我们还可以通过raise语句手动引发异常。

这在某些情况下可以帮助我们主动检查和抛出特定的错误或者条件。

try块的使用可以有效地保护程序免受异常和错误的影响。

通过合理地处理异常,我们可以提高程序的健壮性和稳定性,同时提供更好的用户体验。

以下是一个简单的示例代码,展示了Delphi中try块的基本用法:```Delphitry// 可能引发异常的代码片段// ...except// 异常处理代码// ...finally// 无论是否发生异常都会执行的代码// ...end;```需要注意的是,在异常处理完成后,程序会继续执行try块后面的代码。

因此,我们应注意在异常发生后,通过合适的处理方式使程序能够继续正常运行。

总结来说,Delphi中的try块提供了一种优雅处理异常的机制,可以保护程序免受异常的影响,并提高程序的稳定性和用户体验。

合理使用try块,可以处理不同类型的异常,并提供相应的处理和恢复机制,以确保程序的正常运行。

delphi cannot resolve unit name 方法

delphi cannot resolve unit name 方法

delphi cannot resolve unit name 方法全文共四篇示例,供读者参考第一篇示例:Delphi是一种强大的集成开发环境(IDE),用于创建Windows 应用程序,它使用Object Pascal编程语言。

在使用Delphi开发过程中,有时候可能会遇到“cannot resolve unit name”(无法解析单位名称)的问题,这个问题可能会导致程序无法编译或运行。

本文将探讨该问题的原因和解决办法。

当我们在Delphi项目中引入一个新的单元(unit)时,有时候会出现“cannot resolve unit name”错误。

这个错误通常会出现在编译阶段,它表示Delphi找不到引入的单元的定义,从而无法正确编译项目。

在开发过程中,编译错误是比较常见的,但是“cannot resolve unit name”错误可能比较困难,因为它可能涉及到代码结构、项目设置等方面的问题。

导致“cannot resolve unit name”错误的原因有很多,主要包括以下几点:1. 单元路径设置错误:Delphi需要知道在哪里可以找到引入的单元的定义,需要正确设置单元路径。

单元路径可以在Delphi的项目选项中设置,确保所有需要的单元都在单元路径下。

2. 单元名称拼写错误:有时候由于输入错误或拼写错误导致单元名称与实际名称不匹配,这将导致Delphi无法正确解析单元名称。

3. 单元名称冲突:如果项目中包含了多个名称相同的单元,可能会导致Delphi无法识别正确的单元。

在这种情况下,需要确保每个单元都具有唯一的名称。

4. 编译顺序错误:在Delphi项目中,单元的引入顺序可能会影响编译结果。

如果某个单元在其所依赖的单元之前引入,可能会导致“cannot resolve unit name”错误。

2. 检查单元名称拼写:仔细检查引入的单元名称是否正确,确保没有拼写错误。

3. 检查单元名称冲突:确保项目中每个单元都具有唯一的名称,避免名称冲突。

基于Delphi的异常和错误处理

基于Delphi的异常和错误处理

分析 :如果 t 之后到 AdC n et n .e i rn 这段代 珂 o o n c o 1 gn as i B T
码 中出现异常 , 转到 A o onco1 o bcTas 将跳 dC netn . Uak r 执行 , i R n
但 是 A o o ncin d C n et l因 为 出 错 并 没 有 启 动 事 务 , 所 以 o
正确的代码 :
Ad oCon cinIBegn an ne t o . iTr s; t r y
d C n et 1 U ak rn 执行 时出错 了。 o R 在 体 内的代码发 生异常时 ,系统将转 向 e cp 部分进 A o o ncin .o bc Ta s x et 行异常处理 。这是 De h 处理异常的最 基本 的方 式之 一。 li p
的分配 。
活 中遇到不如 意的事情 , 好了 , 天晴 ; 处理 雨过 处理 不好 , 情况
会越变越糟 , 甚至一发而不可收拾 , 后果难料。程序设计 中同样 如此 , 所谓健壮 的程 序 , 并非是不 出错 的程序 , 是在 出错的情 而 况下能很好地处理 的程序 。因此 , 错误处理 一直是程序设计领
当然 , 基类可 以是 E cpin或者 E cpin的任何 一个 任 x t e o x t e o 意层次的派 生类 。
()在程 序,J 出一个异常 2 It ,
分析 : 不论 子旬如何结束 , n l il f a y子句总是被执行 。 ()不存在 …ecp…f ay n 构来既处 理异常 , 3 xet i l …ed结 nl
()t … f al… e d 2 r i l y n y n;
这种异常 处理 一般 用于保护 Wid w 的资源分配等方面 , no s 和 …ecp…ed不同 , x t n e 该结构的 f al i l y部分总被执 行。 n

delphi erangeerror list index out of range

delphi erangeerror list index out of range

在Delphi 中,ERangeError是一个常见的运行时错误,表示访问数组、集合或列表时,使用的索引超出了其有效范围。

具体来说,当你尝试访问一个不存在的元素时,就会发生这种错误。

例如,考虑以下代码:
delphi复制代码
var
MyList: TArray<string>;
begin
MyList := ['Apple', 'Banana', 'Cherry'];
ShowMessage(MyList[3]); // 这里将触发 ERangeError,因为 MyList 只有
3 个元素,有效的索引是 0, 1, 和 2
end;
在上面的代码中,我们尝试访问MyList的第4个元素(索引为3),但实际上MyList只有3个元素。

因此,当尝试访问不存在的第4个元素时,Delphi 就会抛出ERangeError。

为了解决这个问题,你需要确保你访问的索引在有效范围内。

你可以通过检查数组或列表的长度或大小来做到这一点。

例如:
delphi复制代码
if Length(MyList) > Index && MyList[Index] <> nil then
ShowMessage(MyList[Index])
else
ShowMessage('Index out of range');
在上面的代码中,我们首先检查索引是否在有效范围内,然后再尝试访问该索引的元素。

如果索引超出范围,我们则显示一个消息。

Delphi Access Violation错误的分析

Delphi Access Violation错误的分析

Delphi Access Violation错误的分析Delphi常见的运行期Access Violation错误有哪些?如何防止?任何软件开发都会遇到这样的情况:你写好程序并测试,然后到处发送,结果用户告诉你它失败了。

你可能考虑用编译指令{$D}编译你的程序——Delphi可以建立一个有助于定位Access Violation错误的源代码的镜像文件。

工程选项对话框(Project|Options|Linker & Compiler)让你指定你所需要的一切。

对于单元文件,debug信息和单元的对象代码一起记录在unit文件里了。

编译使用这个单元的程序时,debug信息会增加单元文件的大小而且会增加额外的内存开销,但是它不会影响最终可执行文件的大小和运行速度。

包含debug信息和镜像文件(Project|Options|Linker)选项的产品只有在{$D+} 编译指令下才会完成行信息。

Access violation通常只在程序的某一个方面表现出来。

当问题第一次出现时,考虑一下用户进行了什么操作是很重要的,然后从这里寻找突破口。

从用户的角度来看,你的程序中止了他们的工作,由他们来告诉你出现的问题似乎让你延期解决这个问题了。

然而,与用户交流是你发现问题和改善程序的惟一有效方法。

现在你将可以知道在只给你冲突地址的情况下,如何轻松发现准确路径、源代码文件、发生Access violation错误的行:“Search - Find Error…”。

当一个运行期Access violation出现时,你的用户得到的错误信息类似于如下情况:Access violation at address <十六进制值> in module <应用程序名> Read of address <十六进制值>如果你的程序在Delphi IDE里包含debug信息编译,你可以定位到导致这个错误源代码这一行。

第7章 Delphi异常处理与调试

第7章  Delphi异常处理与调试
delphi程序设计基础教程
第7章 Delphi异常处理与调试
特定整数类型包括ShortInt、Byte以及与整数兼容的枚 举类型、布尔类型等,例如 : type THazard=(Safety,Marginal,Critical, Catastrophic); var Haz:THazard; Item:Integer; begin Item:=5; Haz:=THazard(Itei异常处理与调试
7.2 Delphi异常类
异常类是Delphi异常处理机制的核心,也是Delphi异常 处理的主要特色。Delphi提供的所有异常类都是Exception类 的子类。用户也可以从Exception类派生一个自定义的异常 类。Exception的一系列构造函数中最重要的参数是显示的 错误信息。而数据成员中最重要的也是可被引用的消息字符 串(message,messagePtr)。从大的方面可以把异常类分为 运行库异常、对象异常、组件异常3类。 1. 整数异常 整数异常都是从一个EIntError类派生的,但程序运行中 引发的总是它的子类:EDivByZero、ERangeError和 EIntOverFlow,见表7-1。
delphi程序设计基础教程
第7章 Delphi异常处理与调试
EIntOverFlow异常类在Integer、Word、Longint 3种整数类型越界 时引发。如下面的代码将引发一个EIntOverFlow异常。 var I:Integer; a,b,c:Word; begin a:=10; b:=20; c:=1; for I:=0 to 100 do c:=a*b*c; end; EIntOverFlow异常类只有在编译选择框 Option|Project|Over_Flow_Check Option选中时才产生。当关闭溢出检 查,则溢出后变量的值是丢弃溢出部分后的剩余值。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

硬件异常
硬件异常(基类) EProcessorException 硬件异常(基类) ESingleStep 应用程序产生单步中断 Ebreakpoint 应用程序产生断点中断 故障(继承EProcessorException 也是基类) EProcessorException, Efault 故障(继承EProcessorException,也是基类) EStackFault 对处理器栈段的非法访问 EPageFault 内存管理器无法正确使用交换文件 保护性错误, EGPFault 保护性错误,一般由未初始化指针 或对象造成 EInvalidOpCode 处理器遇到未定义指令
EIntError EDivByZero EIntOverFlow ERangeError 整数计算异常(基类) 整数计算异常(基类) 整数除0 整数除0溢处 整数溢出 整数越界
浮点计算异常
EMathError EInvalidOp Eoverflow Eunderflow EZeroDivide 浮点计算异常(基类) 浮点计算异常(基类) 无效浮点操作指令 浮点操作上溢 浮点操作下溢 浮点计算除0 浮点计算除0
传统方法
早期版本中, 在Pascal早期版本中,程序员必须借助编译器开 早期版本中 关和状态变量去检测和处理存在的错误。 关和状态变量去检测和处理存在的错误。 {$I-}{此编译器指令关闭 检测 此编译器指令关闭I/O检测 此编译器指令关闭 检测} Assign(InFile,InputName); Reset(InFile); {$I+}{此编译器指令恢复 检测 此编译器指令恢复I/O检测 此编译器指令恢复 检测} If IOResult<>0 then {错误处理代码 错误处理代码}; 错误处理代码
异常
由程序导致的不正常情况是错误而不是异常,程 由程序导致的不正常情况是错误而不是异常, 序错误与异常不是相同的概念。 序错误与异常不是相同的概念。 异常是为方便用户报告错误并处理错误而创建的 机制,一般是由操作系统完成的。 机程中, 软件开发过程中,程序员必须提供适度的方式来 处理不可避免的错误。一般方法如下: 处理不可避免的错误。一般方法如下: 1 传统方法 2 使用异常进行错误处理
打印异常
打印异常是由于应用程序向不存在的打印机发送 打印命令或由于某种原因打印工作无法送到打印 机时引发的。 机时引发的。 打印异常类为Eprinter,定义于 定义于Printers单元 打印异常类为 定义于 单元
图形异常
图形异常主要包括EInvalidGraphic和 和 图形异常主要包括 EInvalidGraphicOperation两个类, 两个类, 两个类 均定义于Graphics单元 均定义于 单元
图形异常
EInvalidGraphic异常满足下列情况之一时引发 异常满足下列情况之一时引发: 异常满足下列情况之一时引发
1 当应用程序试图向一个并不包含合法的位图,图象,元 当应用程序试图向一个并不包含合法的位图,图象, 文件或用户自定义图形类型的文件中装入图象时。 文件或用户自定义图形类型的文件中装入图象时。 2 当应用程序试图装入不可识别扩展名的文件时 3 当图象与 当图象与LoadFromClipboardFormat或 或 SaveToClipboardFormat中的格式不匹配时。 中的格式不匹配时。 中的格式不匹配时 4 当应用程序试图将图象的 当应用程序试图将图象的PixelFormat设为不支持的值 设为不支持的值
异常类
Delphi7根据异常类型定义了相应的异常类。 Delphi7根据异常类型定义了相应的异常类。 根据异常类型定义了相应的异常类 所有异常类的基类都是Exception Exception类 所有异常类的基类都是Exception类。 Delphi7内置了大量的异常类 内置了大量的异常类, Delphi7内置了大量的异常类,用户也可以通 过Exception类自定义异常类。 Exception类自定义异常类。 类自定义异常类
图形异常
EInvalidGraphicOperation异常在满足下列条件 异常在满足下列条件 之一时发生: 之一时发生:
1 应用程序访问图象中不存在的扫描线时。 应用程序访问图象中不存在的扫描线时。 2 应用程序不能成功写入图象时。 应用程序不能成功写入图象时。 3 应用程序在画布未处于有效状态时进行绘制。 应用程序在画布未处于有效状态时进行绘制。 4 应用程序装入未知或不支持的图象格式时。 应用程序装入未知或不支持的图象格式时。 5 应用程序将图象的 应用程序将图象的PixelFormat设为不支持的值时 设为不支持的值时 6 不能分配该操作的句柄时。 不能分配该操作的句柄时。
第2章 Delphi7异常处理 Delphi7异常处理
了解什么是异常和Delphi7中提供的异常类 了解什么是异常和Delphi7中提供的异常类 Delphi7 掌握Delphi7 Delphi7环境下自定义异常的方法和异常 掌握Delphi7环境下自定义异常的方法和异常 处理的语法结构与实现
异常
Exception异常类 异常类
例: try raise Exception.Create('我抛出的异常!'); Exception.Create('我抛出的异常 我抛出的异常! except on E:Exception do showmessage(‘异常类名称 +E.ClassName 异常类名称: showmessage( 异常类名称:’+E.ClassName +#13#10+'异常信息 异常信息: +#13#10+'异常信息:'+E.Message); end;
Delphi7异常处理机制 异常处理机制
传统程序设计中, 传统程序设计中,用如下的伪代码方法来检查 和处理程序错误: 和处理程序错误:
执行一个任务 If 前一个任务未能正确执行 执行错误处理 执行下一个任务 If 前一个任务未能正确执行 执行错误处理 ……
Delphi7异常处理机制 异常处理机制
异常类
记住异常类的要点: 记住异常类的要点: 1 异常类是响应不同异常现象的入口。 异常类是响应不同异常现象的入口。 2 熟悉异常类的层次结构。 熟悉异常类的层次结构。
Exception异常类 异常类
Exception是所有异常类的基类,它并不是以 是所有异常类的基类, 是所有异常类的基类 开头, 开头, ‘T’开头,而是以‘E’开头,它的派生类也是以 开头 而是以‘ 开头 开头的。 ‘E’开头的。 开头的 Exception类定义于 类定义于SysUtils单元中。 单元中。 类定义于 单元中 它的定义见书43页 它的定义见书 页 Exception类最常用的方法是 类最常用的方法是Create方法: 方法: 类最常用的方法是 方法 Constructor Create(const Msg:string);
Delphi7异常处理机制 异常处理机制
异常处理的基本思想是通过提供规范方式处 理软,硬件错误的能力,使程序更加健壮。 理软,硬件错误的能力,使程序更加健壮。 异常处理可以将处理错误的代码与正常的逻 辑处理代码相分离。 辑处理代码相分离。 Delphi缺省的方式是在应用程序收到异常之前 缺省的方式是在应用程序收到异常之前 捕获异常。 会给出一个“ 捕获异常。IDE会给出一个“预警”对话框, 会给出一个 预警”对话框, 以指明应用程序将要产生异常。 以指明应用程序将要产生异常。
运行时库异常类(RTL) 运行时库异常类(RTL)
运行时库异常类可分为以下几种: 运行时库异常类可分为以下几种: 1 3 5 6 8 整数计算异常 2 浮点计算异常 硬件异常 4 堆异常 输入输出异常(I/O异常) (I/O异常 输入输出异常(I/O异常) 字符转换异常 7 类型转换异常 哑异常
整数计算异常
Delphi7异常处理机制 异常处理机制
异常处理机制是一种程序设计安全策略, 异常处理机制是一种程序设计安全策略,它是 建立在保护块思想上,通过try和 建立在保护块思想上,通过 和end语句块对 语句块对 代码的封装确保在程序发生异常时, 代码的封装确保在程序发生异常时,程序能够 正常运行或释放所占用的资源。 正常运行或释放所占用的资源。
什么是异常? 什么是异常? 程序开发过程中,有编译期错误和运行期错误, 程序开发过程中,有编译期错误和运行期错误, 编译期错误很容易发现,而运行期错误(逻辑错 编译期错误很容易发现,而运行期错误 逻辑错 误和异常)往往很难预料 往往很难预料。 误和异常 往往很难预料。为了程序的稳定性和 可靠性,就需要对程序异常处理和保护。 可靠性,就需要对程序异常处理和保护。 异常:理解为一种特殊的事件,该事件发生时, 异常:理解为一种特殊的事件,该事件发生时, 程序的正常执行将被打断。 程序的正常执行将被打断。
流异常类
流异常是指在程序中进行与流相关的操作时产生 的异常。流异常类的基类是EStreamError EStreamError, 的异常。流异常类的基类是EStreamError,其他 流异常类都直接或间接从它派生。 流异常类都直接或间接从它派生。 派生关系见书48 48页图 派生关系见书48页图
字符转换异常 EConvertError 类型转换异常 EInvalidCast 哑异常 EAbort
数字到字符串或字符串到数 字转换错误 类型转换异常 调用Abort产生, 调用Abort产生,不显示错误 Abort产生 提示框
对象异常类
对象异常类是针对非组件对象引发的异常而定义 的。 对象异常类包括: 对象异常类包括: 1 流异常类 2 打印异常类 3 图形异常类 4 字符串链表异常类
Exception异常类 异常类
例: Exception.Create(‘我自己创建的异常!’); 我自己创建的异常! 我自己创建的异常 该方法用于创建一个异常类的实例, 该方法用于创建一个异常类的实例,也可以显示 错误信息, 错误信息,也可直接用这个方法提交一个异常 raise Exception.Create(‘我抛出的异常!’); 我抛出的异常! 我抛出的异常
相关文档
最新文档