养成用try...finally的习惯

经常看到有人在分配了一个资源(如创建对象、申请内存、打开句柄等)后,不习惯用try...finally来确保资源得以释放,比如这篇转贴的贴子 ,有如下一段代码(原来的注释被我去掉了):

001    var
002 reg:TRegistry;
003 s:String;
004 begin
005 reg:=TRegistry.Create;
006 reg.RootKey:=HKEY_CURRENT_USER;
007 if reg.OpenKey('/Software/Delphi使用技巧',true) then
008 begin
009 s:=reg.ReadString('文章名称');
010 reg.CloseKey;
011 end;
012 reg.Free;
013 ...
014 end;

上面这段代码其实有很严重的问题:第009行,如果不存在以“文章名称”为名字的值,则ReadString会返回空串,但如果这个值存在但类型不是字串型,则ReadString会抛出一个异常,后果是reg这个TRegistry的实例得不到释放,其实要避免这一点很容易,把try...finally这个好东东加上即可:

001    var
002 reg:TRegistry;
003 s:String;
004 begin
005 reg:=TRegistry.Create;
006 try
007 reg.RootKey:=HKEY_CURRENT_USER; //这句可以没有,对象创建时默认就是这个根键
008 if reg.OpenKey('/Software/Delphi使用技巧',true) then
009 begin
010 s:=reg.ReadString('文章名称');
011 reg.CloseKey; //这句也可以省略,析构或再调用OpenKey时会自动调用CloseKey
012 end;
013 finally
014 reg.Free;
015 end;
016 ...
017 end;

这样就能保证无论如何,reg都会被析构,常见的还有:

with TDialogAbout.Create(nil) do
try
ShowModal;
finally
Free;
end;

GetMem(buf, 1024);
try
...
finally
FreeMem(buf);
end;

hFile := CreateFile(....);
if INVALID_HANDLE_VALUE<>hFile then
try
...
finally
CloseHandle(hFile);
end;

if NOERROR=FindFirst('*.*', faAnyFile, searchRec) then
try
repeat
...
until NOERROR<>FindNext(searchRec);
finally
FindClose(searchRec);
end;
...

finally的效率很高(不象except),几乎不多耗系统资源(特别是流程自然,中途没有exit之类时),为什么不多用,让自己的程序更健壮呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值