【发布时间】:2011-04-07 13:31:18
【问题描述】:
如何将嵌套的 try/finally 块从例程“提取”到可重用实体中?说我有
procedure DoSomething;
var
Resource1: TSomeKindOfHandleOrReference1;
Resource2: TSomeKindOfHandleOrReference2;
Resource3: TSomeKindOfHandleOrReference3;
begin
AcquireResource1;
try
AcquireResource2;
try
AcquireResource3;
try
// Use the resources
finally
ReleaseResource3;
end;
finally
ReleaseResource2;
end;
finally
ReleaseResource1;
end;
end;
想要类似的东西
TDoSomething = record // or class
strict private
Resource1: TSomeKindOfHandleOrReference1;
Resource2: TSomeKindOfHandleOrReference2;
Resource3: TSomeKindOfHandleOrReference3;
public
procedure Init; // or constructor
procedure Done; // or destructor
procedure UseResources;
end;
procedure DoSomething;
var
Context: TDoSomething;
begin
Context.Init;
try
Context.UseResources;
finally
Context.Done;
end;
end;
我希望它具有与嵌套原始文件相同的异常安全性。将TDoSomething.Init 中的ResourceN 变量初始化为零并在TDoSomething.Done 中进行一些if Assigned(ResourceN) then 检查就足够了吗?
【问题讨论】:
-
@Mr.失望:如果它减轻了你的痛苦,想象一下三个嵌套块被提取到三个例程中,然后以嵌套方式调用它们。 :-) 不会改变问题的核心。
-
嘿 - 评论去哪儿了? :-)
-
确实如此 - 当我克服“天哪!”时,我删除了评论由于我不是Delphi的家伙,那一刻还算快,突然回忆起来差了很多。 ;) 但是,我会问:你为什么不能简单地使用一个
try / finally,确定哪些资源没有被获取,然后处理那些资源?不过,我想这就是您要采用的方法。 -
是的。我只是问,因为我不想无意中将异常安全抛到窗外。
标签: delphi refactoring extract try-finally