El manejo de excepciones en Delphi es muy importante, como en todos los lenguajes de programación, la instrucción para dicho manejo en Object Pascal es Try / Finally y Try / Except.
Cuando ocurre un error en la ejecución de nuestro programa, se produce lo que llamamos exception, lo que significa que se crea un objeto de tipo exception y sitúa el puntero de la pila en el primer punto donde se ha provocado la excepción. El objeto exception contiene toda la información sobre el error a nuestra disposición.
Básicamente, la función del Try es forzar a que no finalice de forma abrupta el programa en ejecución una vez generado un error, sino, capturarlo y ejecutar otro bloque de instrucciones que deberían resolver o manejar de cierta manera dicho error obteniendo toda la información sobre el mismo.
La instrucción Try, posee tres modos de uso, veamos cada una de ellas:
Try Exception End
Try
Statement
{Statement...}
Except
Statement
{Statement...}
End;
En este modo de uso, solo si dentro de la cláusula Try, se genera alguna excepción, se ejecutará el bloque de código que se encuentra dentro de la cláusula Except. Esto se usa para tomar medidas alternativas cuando algo inesperado produce algún error. Sin embargo, la cláusula Except no puede determinar que tipo de error se ha producido.
Ejemplo:
var
vResultado: double;
...
try
vResultado := 10 / 0;
except
showmessage('No se puede dividor por cero.');
end;
Try Exception On End
Try
Statement
{Statement...}
Except
On {Name :} Exception type Do
Statement
{Else Statement}
End;
Este uso, es igual al ejemplo anterior, pero con la diferencia de que puede capturar el tipo de error producido y toda su información.
Al generarse una excepción dentro del bloque Try, se ejecutará el bloque de código dentro de Exception, al igual que el ejemplo anterior. Pero en este caso, se creará un objeto Name de tipo Exception, donde tendremos toda la información del error, como lo mostramos en el ejemplo siguiente:
var
vResultado: double;
...
try
vResultado := 10 / 0;
except
On E: Exception do
begin
showmessage('Error: ' + E.ClassName + ' ' + E.Message);
end;
end;
En E: Excepción do, E es un puntero al objeto Exception creado por el error. E.ClassName proporciona el tipo de excepción, como ‘EDivByZero’, y E.Message proporciona el mensaje del error al usuario.
Try Finally End
En este modo de uso de la instrucción Try, no se captura ningún tipo de error, solo se garantiza que la declaración Finally se ejecute absolutamente independientemente de lo que ocurra en la cláusula Try.
Básicamente, al terminar la ejecución del bloque Try, se ejecuta obligatoriamente el bloque Finally. Un ejemplo claro es cuando debemos eliminar de memoria algún objeto creado en tiempo de ejecución para evitar fugas de memoria, como vemos en el siguiente ejemplo:
var
vQuery: TFDQuery;
...
try
try
vQuery := TFDQuery.Create();
with vQuery do
begin
Close;
SQL.Clear;
SQL.Add('Select * from Table');
Open;
end;
except
on E: Exception do
begin
ShowMessage('Error: ' + E.ClassName + ' ' + E.Message);
end;
end;
finally
FreeAndNil(vQuery);
end;