El método Free
en sí mismo no genera explícitamente una excepción, pero llama al destructor virtual Destroy
que ciertamente podría generar una excepción.
Así que si usted quiere estar seguro de que todos los objetos son destruidos, incluso si uno de los destructores lanza una excepción que terminan con un código como éste:
a := TMyObject.Create;
try
b := TMyObject.Create;
try
...
finally
b.Free;
end;
finally
a.Free;
end;
Una vez dicho esto, que debería ser una principio de diseño de que no se generan excepciones en un destructor. Por lo tanto, desde mi punto de vista, es perfectamente razonable considerar que si se produce una excepción en el destructor, entonces su programa estará prácticamente contaminado. Los objetos que se escapan en ese punto no son algo de qué preocuparse. Si su destructor ha provocado una excepción, probablemente ya esté filtrando porque ese destructor no se ejecutó hasta su finalización.
Así que en mi opinión puede ser perfectamente razonable para agrupar algunas llamadas a Free
y por supuesto a evitar anidada try
/finally
que es algo que vale la pena luchar.
Si desea sólo una try
/finally
a continuación, recordar que escribir el código como el siguiente:
a := nil;
b := nil;
try
a := TMyObject.Create;
b := TMyObject.Create;
...
finally
b.Free;
a.Free;
end;
En mi propia base de código que tengo algunos métodos auxiliares que hacen que este limpiador.A continuación, el código puede tener este aspecto:
InitialiseNil(a, b);
try
a := TMyObject.Create;
b := TMyObject.Create;
...
finally
FreeAndNil(b, a);
end;
he dado mi FreeAndNil
el mismo nombre que la función de SysUtils
que a primera vista puede parecer extraño, pero es seguro y benigno para hacerlo. Naturalmente, estos ayudantes entran en acción cuando tienes más de dos objetos.
¿Por qué el voto a favor está fuera de interés? Es una pregunta clara, no hay ambigüedad y realmente quería saber la respuesta. * Se encoge de hombros * –
Creo que aceptaste una respuesta aquí demasiado rápido. – NGLN
@NGLN: De acuerdo en realidad (lo siento TOndrej), creo que la respuesta de David es mucho mejor. –