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.