Unikanie zagnieżdżonych prób… wreszcie blokuje w Delphi

Tego ranka miałem ten pomysł na unikanie zagnieżdżonych bloków próbuj, jak poniżej

procedure DoSomething;
var
  T1, T2, T3 : TTestObject;
begin
  T1 := TTestObject.Create('One');
  try
    T2 := TTestObject.Create('Two');
    try
      T3 := TTestObject.Create('Three');
      try
        //A bunch of code;
      finally
        T3.Free;
      end;
    finally
      T2.Free;
    end;
  finally
    T1.Free;
  end;
end;

Korzystając z automatycznego zliczania referencji interfejsów, wymyśliłem

Type  
  IDoFinally = interface
    procedure DoFree(O : TObject);
  end;

  TDoFinally = class(TInterfacedObject, IDoFinally)
  private
    FreeObjectList : TObjectList;
  public
    procedure DoFree(O : TObject);
    constructor Create;
    destructor Destroy; override;
  end;

//...

procedure TDoFinally.DoFree(O : TObject);
begin
  FreeObjectList.Add(O);
end;

constructor TDoFinally.Create;
begin
  FreeObjectList := TObjectList.Create(True);
end;

destructor TDoFinally.Destroy;
begin
  FreeObjectList.Free;
  inherited;
end;

Tak, że poprzedni blok kodu staje się

procedure DoSomething;
var
  T1, T2, T3 : TTestObject;
  DoFinally : IDoFinally;
begin
  DoFinally := TDoFinally.Create;
  T1 := TTestObject.Create('One');
  DoFinally.DoFree(T1);
  T2 := TTestObject.Create('Two');
  DoFinally.DoFree(T2);
  T3 := TTestObject.Create('Three');
  DoFinally.DoFree(T3);
  // A Bunch of code;
end;

Moje pytanie brzmi: czy to działa, czy coś przeoczyłem?

Dla mnie wygląda to całkiem fajnie i sprawia, że ​​kod jest nieco łatwiejszy do odczytania przy zmniejszonej ilości zagnieżdżania. Można go również rozszerzyć o przechowywanie listy anonimowych metod uruchamiania, takich jak zamykanie plików, zapytania itp.

questionAnswers(9)

yourAnswerToTheQuestion