动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Delphi教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Delphi教程 ]的信息

本月文章推荐
.用Delphi产生一个最小的可执行程.
.设计模式、用Delphi描述-->Visit.
.控件在运行状态改变大小.
.Delphi中获取打印机设备名和端口.
.利用Delphi中的画布画树.
.一个导出Excel非常快的类.
.TextFile读写.
.Format的用法.
.Delphi开发WEBMAIL程序.
.支持自绘画的属性编辑器.
.TWebBrowser的常见属性和方法.
.程序间参数传递.
.从当前的浏览器取得当前URL.
.DELPHI中动态获得SQLSERVER数据库.
.在DELPHI2.0/3.0中直接操作端口.
.如何将C/C++程序转译成Delphi.
.Delphi中的类和对象.
.在Delphi里播放Flash.
.使用IntraWeb进行Web编程.
.在Delphi中获取和修改文件的时间.

《delphi高手突破》节选二

发表日期:2006-2-4 |


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

构造函数与异常

这个话题在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的风格,注重程序的美学意义,编译器帮助程序员完成复杂的工作。
上一篇:自动编号的存储过程 人气:5466
下一篇:用DELPHI制作在线程序升级信息查询 人气:3570
浏览全部Delphi的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-9-7 站长中国企业(公司)网站系统 v4.2
2008-9-7 PBDigg v2.0 Build 20080821
2008-9-7 玩玩小游戏FLASH系统 v2.1
2008-9-7 522QQ在线电视直播程序 v1.1
2008-9-7 Pcook cms 文章管理系统 (老Y CM
2008-9-7 仿代码小说小偷系统 v1.0
2008-9-7 百度一搜集成搜索管理系统
2008-9-7 小贤统计器 v1.0
2008-9-7 UCenter Home-中秋搏饼插件 v1.2
2008-9-7 iBlacklist通话黑名单汉化破解补
2008-9-7 EndlessWalls无尽壁纸 v1.0.4破解
2008-9-7 Dynolicious车载测量仪v1.1破解版
2008-9-7 iVoodoo巫毒娃娃1.0.1破解版
2008-9-7 iWallpape精品墙纸1.2破解版
2008-9-7 iChillout自然音效工具1.1破解版
2008-9-7 Todo计划提醒1.2破解版
2008-9-7 allRadio电台集合1.01破解版
2008-9-7 My Money个人理财1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵