segunda-feira, 29 de dezembro de 2008

Não lance exceções no destrutor

Existem boas práticas de programação que não são ensinadas nos manuais, sendo descobertas com a experiência. 
Uma boa prática, pelo menos em se tratando de Delphi, é o de não lançar exceções em destrutores. Isso evita termos que espalhar um tratamento para esse tipo de falha por todo o nosso código.

Vejamos um exemplo:

type
  TDoc = class
  ...
  end;

destructor TDoc.Destroy;
begin
  raise Exception.Create('Fail');
end;

type
  TSuperDoc = class
  private
    FDoc: TDoc;
    FList: TList;
  ...
  end;

destructor TSuperDoc.Destroy;
begin
  try
    FDoc.Free;
  except
  end;
  FList.Free;
end;

           
O fato de lançarmos exceções no destrutor de TDoc nos obriga a tratarmos esse tipo de problema no destrutor de TSuporDoc, para não termos nenhum memory leak

Em outro post, falarei sobre como economizar declarações try... finally.