《delphi高手突破》节选二
完成了第三章 异常及错误处理,节选一节
构造函数与异常
这个话题在C++社区中经常会被提起,而在Delphi社区中似乎从来没有人注意过。也许由于语言的特性,使得Delphi程序员不必关心这个问题。但我想Delphi程序员也应该对该问题有所了解,知道语言为我们提供了什么而使得我们如此轻松,不必理会它。正所谓“身在福中须知福”。
我们知道,类的构造函数是没有返回值的,如果构造函数构造对象失败,不可能依靠返回错误代码。那么,在程序中如何标识构造函数的失败呢?最“标准”的方法就是:抛出一个异常。
构造函数失败,意味着对象的构造失败,那么抛出异常之后,这个“半死不活”的对象会被如何处理呢?
在此,我想读着有必要先对C++对这种情况的处理方式先有个了解。
在C++中,构造函数抛出异常后,析构函数不会被调用。这种做法是合理的,因为此时对象并没有被完整构造。
如果构造函数已经做了一些诸如分配内存、打开文件等操作的话,那么C++类需要有自己的成员来记住做过哪些动作。当然,这样做对于类的实现者来说非常麻烦,因此一般C++类的实现者都避免在构造函数中抛出异常(可以提供一个诸如Init和UnInit的成员函数,由构造函数或类的客户去调用它们,以处理初始化失败的情况)。而每一本C++的经典著作所提供的方案是使用智能指针(STL的标准类auto_ptr)。
在Object Pascal中,这个问题变得非常的简单,程序员不必为此大费周折。如果Object Pascal的类在构造函数中抛出异常,编译器会自动调用类的析构函数(由于析构函数不允许被重载,可以保证只有唯一一个析构函数,因此编译器不会迷惑于多个析构函数之中)。析构函数中一般会析构成员对象,而Free()方法保证了不会对nil对象(即尚未被创建的成员对象)调用析构函数,因此在使得代码简洁优美的前提下,又保证了安全。
type MyClass = class
private
FStr : PChar; // 字符串指针
public
constructor Create();
destructor Destroy(); override;
end;
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的风格,注重程序的美学意义,编译器帮助程序员完成复杂的工作。- · Borland 公布支持 Microsoft .NET平台产品策略
- · 准备迎接Kylix
- · Window SubClassing之另类运用(之一)
- · delphi窗体图体画法 之我见!
- · Delphi 类的静态属性
- · 修改Delphi使之适应SQL Server2000
- · 对Delphi控件的一点改良
- · 对Delphi控件的一点改良(二)
- · 对Delphi控件的一点改良(三)
- · 改良控件-Delphi自带控件Bug的消除
- · 理解类引用这种类型
- · 剖析TThread类
- · 换肤手术
- · 不知您是笨蛋,还是我是笨蛋,关于Delphi的大Bug
- · Window SubClassing另类运用(之二)
- · 关于Delphi大Bug的更详细的例子
- · Delphi函数快速参考
- · 用Delphi开发Web Services数据库程序
- · 用Delphi制作个性化的菜单
- · win2000用户,你的“本地连接”会突然不见了吗?
- · 一个功能增强的Delphi TListView组件
- · listbox多选状态下的自拖与互拖
- · “98五笔字型输入法”大批量造词
- · Borland IDE 常用热键简介 v0.1
- · 从实作标题栏按钮开始浅谈组件的制作
- · 如何把数据库的内容写入到Word文档中?(胡广涛)
- · 如何用Delphi制作录音程序
- · 用Delphi在局域网中实现网上影院
- · 谈Delphi编程中“流”的应用
- · 谈Delphi编程中资源文件的应用
- · Delphi编程实现程序快捷方式[原创]
- · 编程动动手,Ping程序“跟你走”![原创]
- · 通过API访问IE Cache
- · Delphi随笔一
- · Delphi随笔二
- · Delphi 6 XML文件编程
- · Delphi 6 XML数据绑定
- · Delphi 6 XML映象工具
