¿Dónde ha quedado el Errorsys de Clipper?
Pues todo aquello de modificar el fichero de control de errores, recompilarlo con la aplicación, etc. se ha quedado en nada que se le parezca al funcionamiento y detección de errores en Delphi.
La similitud sería mas facil encontrarla en la clase Error de las versiones de Clipper 5.x, en la cual se genera una llamada a ErrorBlock pudiendose desde aquí crear la función propia de control. El "parecido" puede encontrarse en la llamada y en la protección de un bloque de código (no un CodeBlock) mediante la estructura
Begin ... Sequence
Definidos en el fichero de cabecera ERROR.CH se encuentran los códigos que se generan.
Veamos en Delphi. El tratamiento de los errores se efectúa mediante las denominadas "excepciones". El proceso no es dificil, basta considerar dos tipos de excepciones: las que manda una unidad denominada SysUtils cada vez que se encuentra con un error en ejecución y las que puede lanzar el usuario ante una eventualidad.
La estructura principal de protección del bloque en este caso es Try ... Finally.
Veamos un ejemplo:
Código Delphi
[-]
var f:TForm1;
begin
f:TForm1.Create(Self);
try
f.ShowModal;
finally
F.Free;
end;
En el caso de producirse un error en un punto del bloque Try (en este caso al mostrar el form), inmediatamente abandona la ejecución del bloque y pasa el control a Finally, que liberará la memoria.
Esta es la forma más usual de protección ante errores, la otra estructura utilizada es Try ... Except es menos utilizada, salvo que lo que se pretenda sea manejar las excepciones.
Código Delphi
[-]
b:=5;
c:=0;
try
a := b div c;
except
end;
En un momento cualquiera y dentro del bloque Try se produce un error (en este caso división por cero), inmediatamente se sale y si se ha definido dentro del bloque Except un manejador de errores lo ejecuta. Como no se trata de efectuar un estudio exhaustivo, baste con decir que la estructura sería de este tipo:
Código Delphi
[-]
try
a:=b div c;
except
on Excepción do
begin
.......
end;
end;
Donde Excepción definiría el error que la ha provocado, en este caso EZeroDivide.
En otros casos sería mas compleja la detección del error en concreto, y se lograría mediante la herencia de la clase Exception, pero no es ese el tema en este momento.
También se especificaba arriba que el usuario puede lanzar una excepción. Esto se consigue sin mas que ejecutando Raise. La utilidad de ello es muy variada e importante, habida cuenta que permite que con su sola ejecución actúen las estructuras Try anteriores o crear una excepción concreta si se pretende esto.
Como la única pretensión es facilitar el camino a los programadores que proviniendo de Clipper "aterrizan" en Delphi, no parece oportuno profundizar más en estas cuestione, en otras preguntas se tratará con más profundidad.