Delphi内建异常类 异常处理参考


【详细过程】
Eabort:静静的触发异常而不提示任何信息对话框,调用abort函数触发此异常;

Eabstracterror:程序企图调用一个纯虚拟方法(abstract method)时产生异常;

Eaccessviolcation:无效内存(memory)处理操作;

Eassertionfailed:当代入asscert的函数的参数的值为false时;

Econtrolc:于console模式的应用程序中按下CTRL+C;

Econversionerror:几何方面(measurement)的转型错误;

Econverterror:字符串和对象方面的转型错误;

Edivbyzero:整数除0的错误;

Eexternnal:捕获WINDOWS系统异常记录时;

Eexternalexception:无效的异常程序代码;

Einouterror:文件输入、输出的错误;

Eintfcasterror:接口指定(interface casting)的错误;

Eintoverflow:整数计算后的结果超过所配置的register;

Einvalidcast:无效的typecast;

Einvalidpointer:无效的指针操作;

Einvalidop:未定义的浮点操作;

Ematherror:浮点(float-point)数学上的错误;

Eoserror:操作系统运行错误;

Eoutofmemory:无法成功配置内存;

Eoverflow:浮点register溢位;

Epackageerror:封包关联(package-related)上的错误;

Veprivilege:处理程序特权违法;

Epropreadonly:以OLE自动写入属性(property)无效;

Epropwriteonly:以OLE自动读取属性无效;

Erangeerror:整数值超出范围;

Esafecallexception:因使用SAFECALL所产生的问题;

Estackoverflow:堆栈过多;

Eunderflow:其值太小而无法用浮点数表示;

Evarianterror:与variant数据类型有关的错误;

Ewin32error:windows系统方面的错误;

Exception:所有运行时异常基础类型;

Ezerodivide:浮点数(float-point)除以0的错误;

  

12.1.2.1 流异常类 

  流异常类包括EStreamError、EFCreateError、 EFOpenError、EFilerError、EReadError、EWriteError、EClassNotFound。它们的结构关系如下: 

EStreamError

|---------- EFCreateError

|---------- EFOpenError

|---------- EFilerError

|--------- EReadError

|--------- EWriteError

|--------- EClassNotFound

    图12.1 流异常结构图 

流异常在Classes库单元中定义。

  流异常引发的原因如表12.6。

表12.6  流异常类及其产生原因

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

异常类 引发原因

─────────────────────────────────

EStreamError 利用LoadFromStream方法读一个流发生错误

EFCreateError 创建文件时发生错误

EFOpenError 打开文件时发生错误

EFilerError 试图再次登录一个存在的对象

EReadError ReadBuffer方法不能读取特定数目的字节

EWriteError WriteBuffer方法不能写特定数目的字节

EClassNotFound 窗口上的部件被从窗口的类型定义中删除

12.2 异常保护 

  确保回收分配的资源是程序健壮性的一个关键。但缺省情况下异常发生时程序会在出错点自动退出当前模块,因此需要一种特殊的机制来确保即使在异常发生的情况下释放资源的语句仍能被执行。而Delphi的异常处理正提供了这种机制。 

12.2.1 需要保护的资源 

  一般说来需要保护的资源包括:

  ● 文件

  ● 内存

  ● Windows资源

  ● 对象 

在异常保护的情况下,当异常发生时,系统会自动弹出一个消息框用于显示异常的消息。退出当前模块后异常类自动清除。

异常响应为开发者提供了一个按自己的需要进行异常处理的机制。try …except …end形成了一个异常响应保护块。与finally不同的是:正常情况下except 后面的语句并不被执行,而当异常发生时程序自动跳到except,进入异常响应处理模块。当异常被响应后异常类自动清除。

  下面的例子表示了文件打开、删除过程中发生异常时的处理情况: 

uses Dialogs;

var

F: Textfile;

begin

OpenDialog1.Title := 'Delete File';

if OpenDialog1.Execute then

begin

AssignFile(F, OpenDialog1.FileName);

try

Reset(F);

if MessageDlg('Erase ' +OpenDialog1.FileName + '?',

mtConfirmation, [mbYes, mbNo], 0) = mrYes then

begin

System.CloseFile(F);

Erase(F);

end;

except

on EInOutError do

MessageDlg('File I/O error.', mtError, [mbOk], 0);

on EAccessDenied do

MessageDlg('File access denied.', mtError, [mbOk], 0);

end;

end;

end.

  保留字on…do用于判断异常类型。必须注意的是:except后面的语句必须包含在某一个on…do模块中,而不能单独存在。这又是同finally不同的一个地方。 

12.3.1 使用异常实例 

  上面所使用的异常响应方法可总结为如下的形式: 

  on ExceptionType do

{响应某一类的异常} 

  这种方法唯一使用的信息是异常的类型。一般情况下这已能满足我们的需要。但我们却无法获取异常实例中包含的信息,比如异常消息、错误代码等。假设我们需要对它们进行处理,那么就必须使用异常实例。

  为了使用异常实例,需要为特定响应模块提供一个临时变量来保存它: 

  on EInstance : ExceptionType do  … 

  在当前响应模块中我们可以象使用一个普通对象那样来引用它的数据成员。但在当前响应模块之外不被承认。

  下面的代码用于获取异常消息并按自己的方式显示它: 

{窗口中包括一个ScrollBar部件,一个Button部件} 

procedure TErrorForm.Button1Click(Sender: TObject);

begin

try

ScrollBar1.Max := ScrollBar1.Min-1;

except

on E: EInvalidOperation do

MessageDlg('Ignoring Exception:'+E.Message,

mtInformation,[mbOK],0);

end;

end; 

12.3.2 提供缺省响应 

  在异常响应模块中,一般我们只对希望响应的特定异常进行处理。如果一个异常发生而响应模块并没有包含对它的处理代码,则退出当前响应模块,异常类仍被保留。

  为了保证任何异常发生后都能在当前响应模块中被清除,可以定义缺省响应: 

try

{程序正常功能}

except

on ESomething do

{响应特定异常}

else

{提供缺省响应}

end; 

由于else可以响应任何异常,包括我们一无所知的异常,因此在缺省响应中最好只包括诸如显示一个消息框之类的处理,而不要改变程序的运行状态或数据。


12.3.6 利用异常响应编程 

  利用异常处理机制不仅能使程序更加健壮,而且也提供了一种使程序更加简捷、明了的途径。事实上,使用自定义异常类就是一种利用异常响应编程的方式。这里我们再讨论几个利用标准异常类编程的例子。

  比如为了防止零作除数,可以在进行除法运算前使用if…then…else语句。但如果有一系列这样的语句则繁琐程度是令人难以忍受的。这时候我们可能倾向于使用EDivByZero异常。例如如下一段程序就远比用if…then…else实现简捷明了。 

function Calcu(x,y,z,a,b,c:Integer):Real;

begin

try

Result := x/a+y/b+z/c ;

except

on EDivByZero do

Result := 0;

end;

end;

在(6.2.3)记录文件的打开与创建中就是利用异常响应来实现文件的打开或创建。 

procedure TRecFileForm.OpenButtonClick(Sender: TObject);

begin

if OpenDialog1.Execute then

FileName := OpenDialog1.FileName

else

exit;

AssignFile(MethodFile,Filename);

try

Reset(MethodFile);

FileOpened := True;

except

on EInOutError do

begin

try

if FileExists(FileName) = False then

begin

ReWrite(MethodFile);

FileOpened := True;

end

else

begin

FileOpened := False;

MessageDlg('文件不能打开',mtWarning,[mbOK],0);

end;

except

on EInOutError do

begin

FileOpened := False;

MessageDlg('文件不能创建',mtWarning,[mbOK],0);

end;

end;

end;

end;

if FileOpened = False then exit;

Count := FileSize(MethodFile);

if Count > 0 then

ChangeGrid;

RecFileForm.Caption := FormCaption+' -- '+FileName;

NewButton.Enabled := False;

OpenButton.Enabled := False;

CloseButton.Enabled := True;

end; 

总之,利用异常响应编程的中心思想是虽然存在预防异常发生的确定方法,但却对异常的产生并不进行事前预防,而是进行事后处理,并以此来简化程序的逻辑结构。 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi是一种可视化编程环境,其中间件是指在客户端和服务器之间进行通信的软件组件或模块。使用Delphi编写的中间件源码通常用于实现不同系统之间的数据交换、业务逻辑处理和远程调用等功能。 Delphi提供了丰富的多线程编程和网络通信的函数库,开发者可以根据项目需求选择合适的中间件组件。其中,常用的中间件技术包括Web服务、消息队列、TCP/IP通信等。 要实现一个Delphi中间件,通常需要编写以下几个主要功能模块: 1. 连接管理模块:负责建立和管理客户端与服务器之间的连接,可以处理连接的建立、断开、超时等事件,并提供连接池或连接重用机制,以提高性能和可靠性。 2. 数据传输模块:负责处理客户端和服务器之间的数据传输,可以采用常见的数据格式如XML、JSON等进行数据封装和解析,并提供数据压缩、加密等功能以增加数据传输效率和安全性。 3. 业务逻辑处理模块:根据具体项目需求,编写相应的业务逻辑处理模块,例如订单处理、用户管理、支付操作等,可以通过调用远程服务或在服务器端直接处理。 4. 异常处理模块:处理在中间件执行过程中可能出现的异常情况,例如网络连接异常、数据传输错误等,并提供相应的错误处理机制,如日志记录、错误提示等。 中间件源码的编写需要具备一定的编程和网络通信知识,熟悉Delphi开发环境和相应的组件库。在编写过程中,可以参考相关的开源项目或文档,根据实际需求进行相应的二次开发和定制。 总而言之,Delphi中的中间件源码编写是为了实现不同系统之间的数据交换和远程调用等功能,具体的实现可以根据项目需求而定,需要编写连接管理、数据传输、业务逻辑处理和异常处理等模块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值