《delphi高手突破》节选二

原创 2002年02月12日 21:26:00

完成了第三章 异常及错误处理,节选一节

构造函数与异常

这个话题在C++社区中经常会被提起,而在Delphi社区中似乎从来没有人注意过。也许由于语言的特性,使得Delphi程序员不必关心这个问题。但我想Delphi程序员也应该对该问题有所了解,知道语言为我们提供了什么而使得我们如此轻松,不必理会它。正所谓“身在福中须知福”。

我们知道,类的构造函数是没有返回值的,如果构造函数构造对象失败,不可能依靠返回错误代码。那么,在程序中如何标识构造函数的失败呢?最“标准”的方法就是:抛出一个异常。

构造函数失败,意味着对象的构造失败,那么抛出异常之后,这个“半死不活”的对象会被如何处理呢?

在此,我想读着有必要先对C++对这种情况的处理方式先有个了解。

C++中,构造函数抛出异常后,析构函数不会被调用。这种做法是合理的,因为此时对象并没有被完整构造。

如果构造函数已经做了一些诸如分配内存、打开文件等操作的话,那么C++类需要有自己的成员来记住做过哪些动作。当然,这样做对于类的实现者来说非常麻烦,因此一般C++类的实现者都避免在构造函数中抛出异常(可以提供一个诸如InitUnInit的成员函数,由构造函数或类的客户去调用它们,以处理初始化失败的情况)。而每一本C++的经典著作所提供的方案是使用智能指针(STL的标准类auto_ptr)。

Object Pascal中,这个问题变得非常的简单,程序员不必为此大费周折。如果Object Pascal的类在构造函数中抛出异常,编译器会自动调用类的析构函数(由于析构函数不允许被重载,可以保证只有唯一一个析构函数,因此编译器不会迷惑于多个析构函数之中)。析构函数中一般会析构成员对象,而Free()方法保证了不会对nil对象(即尚未被创建的成员对象)调用析构函数,因此在使得代码简洁优美的前提下,又保证了安全。

type MyClass = class

private

FStr : PChar; // 字符串指针

public

constructor Create();

destructor Destroy(); override;

end;

 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

constructor MyClass.Create();

begin

FStr := StrAlloc(10); // 构造函数中为字符串指针分配内存

StrCopy(FStr, 'ABCDEFGHI');

raise Exception.Create('error'); // 抛出异常,没有理由,呵呵

end;

 

destructor A.Destroy();

begin

StrDispose(FStr); // 析构函数中释放内存

WriteLn('Free Resource');

end;

 

var

Obj : TMyClass;

i : integer;

begin

try

Obj := TMyClass.Create();

Obj.Free();

WriteLn('Succeeded');

except

Obj := nil;

WriteLn('Failed');

end;

 

Read(i); // 暂停屏幕,以便观察运行结果

end.

 

在这段代码中,构造函数抛出异常,执行的结果是:

Free Resource

Failed

此时的“Free Resource”输出是由编译器自动调用析构函数所产生的。

因此,如果类的说明文档或类的作者告知你,类的构造函数可能会抛出异常,那就要记得用try…except包住它!

C++Object Pascal对于构造函数抛出异常后的不同处理方式,其实正是两种语言的设计思想的体现。C++秉承C的风格,注重效率,一切交给程序员来掌握,编译器不作多余动作。Object Pascal继承Pascal的风格,注重程序的美学意义,编译器帮助程序员完成复杂的工作。

抓翻倍牛股的简易方法 缘分战法(牛股突破战法)

入市切记:      “只做大波”,周线为准;     满进满出不留尾巴;             只要属于你的那一只股票(沧海万千,只求一粟)。         ...
  • eidolon8
  • eidolon8
  • 2015年10月31日 23:48
  • 3541

delphi VCL研究之消息分发机制-delphi高手突破读书笔记

1.VCL 概貌 先看一下VCL类图的主要分支,如图4.1所示。 在图中可以看到,TObject是VCL的祖先类,这也是Object Pascal语言所规定的。但实际上,TObject以及TObj...
  • sushengmiyan
  • sushengmiyan
  • 2013年03月04日 21:36
  • 3256

winform treeview改变选中节点颜色,失去焦点时选中节点仍突显。

发现当treeview控件失去焦点的时候,会丢失选中状态的指示(条目的蓝色背景)。如果想要保持,只要设置treeview的一个属性即可: this.treeView1.HideSelection =...
  • wumiju
  • wumiju
  • 2015年11月16日 15:55
  • 3509

delphi高手突破之异常及错误处理

什么是异常?为什么要用它? 所谓“异常”是指一个异常类的对象。Delphi的VCL中,所有异常类都派生于Exception类。该类声明了异常的一般行为、性质。最重要的是,它有一个Message属性可...
  • sushengmiyan
  • sushengmiyan
  • 2012年04月25日 22:49
  • 1644

【读书笔记】【Delphi高手突破】TControl与Windows消息的封装

今天开始开通博客,写一些读书笔记,用以以后自己便于查阅。 1,VCL类图主要分支 2,TObject与消息分发(万物之源“TObject”的消息机制原理) a:自定义  TMyMsg:记录消...
  • putin1223
  • putin1223
  • 2015年01月05日 17:18
  • 196

【读书笔记】【Delphi高手突破】TCanvas

1,VCL将GDI的设备抽象成一个画布(Canvas) TCanvas = class(TPersistent) private FHandle: HDC; State: TCanvasState;...
  • putin1223
  • putin1223
  • 2015年01月06日 14:48
  • 323

【读书笔记】【delphi高手突破】TCanvas与Windows GDI

TCanvas: 一条为图形组件(基类:TGraphicControl) , 一条为窗口组件(基类:TWinControl)。 1,TGraphicControl讲解(Tpen和Tbrush原理基本一...
  • putin1223
  • putin1223
  • 2015年01月06日 14:07
  • 377

Delphi高手突破

  • 2007年11月28日 00:31
  • 5.77MB
  • 下载

014_《Delphi高手突破》

  • 2010年11月22日 14:52
  • 1.72MB
  • 下载

Delphi高手突破

  • 2011年05月07日 20:20
  • 12.31MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《delphi高手突破》节选二
举报原因:
原因补充:

(最多只允许输入30个字)