Как бы вы «извлекли» вложенные блоки 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;
Я хочу, чтобы у этого была такая же безопасность исключений, как у вложенного оригинала. Достаточно ли обнулить переменные ResourceN в TDoSomething.Init
и выполнить несколько if Assigned(ResourceN) then
проверок в TDoSomething.Done
?
try / finally
, определяя, какой ресурс не был получен, и избавляясь от тех, которые были? Я предполагаю, что именно к этому вы и направляетесь со своим подходом. - person Grant Thomas   schedule 07.04.2011