Skip to content

Manejo de Excepciones

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;