转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
沉默的异常--Delphi帮助寻宝之一         ★★★★

沉默的异常--Delphi帮助寻宝之一

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1395 更新时间:2009/4/23 18:42:49

沉默的异常--Delphi帮助寻宝之一

作者: Musicwind®

创建时间: 2001-10-19

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

更新历史:No.2

更新时间:2001-10-21 02:42

更新人员:Musicwind®

更新备注:修改格式。

 

更新历史:No.1

更新时间:2001-10-19 21:15

更新人员:Musicwind®

更新备注:创建。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

       前言:沉浸于Delphi已逾三载,可是每每翻阅Delphi的帮助文档,还是会有许多收获,于是不免感慨Delphi的博大!在惭愧之余,将些许心得和收获整理,与诸位当中如我般自大而学识尚浅者,共勉。

 

1.         什么是沉默的异常?(为什么不是沉默的羔羊?;-))

沉默的异常,即Slient Exceptions,指的是在缺省情况下不会出现讨厌的消息提示框的异常类型:EAbort。在Object Pascal中,异常类EAbort是所有沉默的异常类的祖先类(而EAbort是继承Exception而来)。引发(Raise)一个EAbort将导致一个执行模块的停止,直到有最外层的异常处理模块截获它,但是并不因此出现带有红色停止标志的消息框。参考如下代码:

      try

        ShowMessage(''''Hello1'''');

        Raise EAbort.Create(''''Abort it'''');

        ShowMessage(''''Hello2'''');

     except

       on E: Exception do

         showmessage(''''On Exception'''');

     end;

 

       执行结果显示两个消息框,一个是”Hello1”,另一个是”On Exception”。这表明,EAbort确实发挥了作用,因为它跳过了”ShowMessage(‘Hello2’)”这个语句;同时,没有出现”Abort it”的消息框,也证实了EAbort异常类的不出现对话框的特点(在设计期间也是如此);并且,消息框”On Exception”表明,虽然可能EAbort是个不同于普通异常的异数,但这并不妨碍我们沿用老的Try-Except语句来捕获它。

 

2.         为什么要用EAbort

EAbort在某些场合下很有用。比如当我们需要终止某项操作,而又不希望让用户察觉(不想让他们看到默认的异常消息框)。当然,要达到相同的效果,使用普通的异常也可以做到(比如使用Try-Except句型,将代码放在Try段,需要终止操作则raise一个异常,而在Except段不写任何代码),但是这一切没有比使用EAbort来的简单又直接。

 

3.         有什么简便一点的吗?——使用Abort过程

SysUtils单元中定义的一个过程Abort可以让我们方便的使用EAbort。查看Abort的实现源码:

 

    procedure Abort;

      function ReturnAddr: Pointer;

      asm

         MOV     EAX,[EBP + 4]

      end;

    begin

      raise EAbort.Create(SOperationAborted) at ReturnAddr;

    end;

       这里的SOperationAborted通常就是” Operation aborted”。

 

4.         揭开面纱——实现原理

也许各位和我一样,对于EAbort为什么是沉默的感到好奇。Delphi在其内部,究竟对EAbort做了什么手脚呢?让我们一起来看个究竟。

       打开一个新的工程,点击Find in Files,输入”EAbort”关键字,然后选中Search in Directories单选框,并将Search Directory Options中的File Mask编辑框设置为Delphi源码所在的目录名(比如我的是:D:\Program Files\Borland\Delphi6\Source\),同时别忘记给Include SubDirectory打勾。最后,点击”OK”开始搜索。

       结果我们发现Delphi源码中与EAbort有瓜葛的达17处之多。除去Sysutils单元中两处对EAbort的声明以及部分注释语句,我们发现绝大多数代码类似于:

       if ExceptObject is EAbort then

       以及:

       if not (E is EAbort) then

       等等。

       无一不是根据RTTI来对EAbort特殊对待的——原来EAbort的实现就这么简单!

       值得关注的两个单元是:Forms(Linux版本为QForms)和AppEvnts,在前者的代码中我们更不难找到问题的答案。参见Delphi源码:

    procedure TApplication.HandleException(Sender: TObject);

    begin

      if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0);

      if ExceptObject is Exception then

      begin

        if not (ExceptObject is EAbort) then

          if Assigned(FOnException) then

            FOnException(Sender, Exception(ExceptObject))

          else

            ShowException(Exception(ExceptObject));

      end else

        SysUtils.ShowException(ExceptObject, ExceptAddr);

    end;

 

5.         Abort与Break和Exit之区别

Abort和Break和Exit有些相似,又很不同。Break用来在循环语句中跳出一层循环。Exit用来跳出当前执行的函数体(或过程体)。Abort可以让你跳出一层或者多层代码段,直到有异常捕获的代码将它捕获。

 

6.         自定义沉默的异常

与声明一个普通异常类的子类相同,只需将EAbort及其子类作为祖先类即可:

TMyException = Class(EAbort);

TNextException = Class(EAbort);

等等。

Musicwind®@HangZhou.Zhejiang.China

2001-10-20

[1] [2]  下一页


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台