Obligatoriamente, cada vez que se reserva memoria, (creación de un objeto, una estructura dinámica o un puntero) ha de asegurarse que esta sea liberada. También cuando se hace uso de recursos del sistema.
Por ejemplo:
Código Delphi
[-]
Var
strs : TStringList;
Begin
strs := TStringList.Create;
try
Sentencias;
finally
strs.Free; end;
end;
var
p : PunteroAAlgo;
Begin
p := new(TipoDeDato);
try
sentencias;
finally
dispose(p); end;
end;
Luego, también es importante "proteger" aquellos bloques en los que interesa tratar algún error específico. Esto ya depende de las necesidades y objetivos de la aplicación y el nivel de conocimiento del programador. Por ejemplo, si se abre un archivo, hay que considerar, por lo menos, la posibilidad de que ese archivo no exista, y luego decidir que hacer en este caso (informar al usuario, crear el archivo, abortar el proceso, etc).
Por regla general, solo se tratarán aquellas excepciones para las que se tenga una solución, y se dejarán sin tratar todas las demas. También las excepciones se tratarán siempre tan cerca como sea posible al lugar donde se generan.
En el caso del archivo:
Código Delphi
[-]
Var
f : TFileStream;
Begin
try
f := TFileStream.Create('archivo.dat', fmOpenRead);
except
on EFileNotFound do
f := TFileStream.Create('archivo.dat', fmCreate);
end;
try
TrabajamosConElStream;
finally
f.Free;
end;
end;
En este bloque, se trata la excepción EFileNotFound. De esa manera, si el archivo no existe, se crea uno nuevo. Sin embargo, no tratamos otras excepciones (que no sabemos como tratar), tal como EOutOfResources. Si el sistema se ha quedado sin recursos, confiamos que un bloque mas externo tratará la excepción... y si no, en última instancia dejamos que delphi se encargue de ella.
En fin... este es un post ya bastante largo. Espero que de algo sirva tanto rollo.
Hasta luego.