Anda di halaman 1dari 3

Como manejar excepciones en Delphi (I)

Las excepciones son condiciones excepcionales que se producen en nuestra aplicacin en


tiempo de ejecucin y que requieren un tratamiento especial. Un ejemplo de excepciones
podra ser las divisiones por cero o los desbordamientos de memoria. El tratamiento de
excepciones proporciona una forma estndar de controlar los errores, descubriendo
anticipadamente los problemas y posibilitando al programador anticiparse a los fallos que
puedan ocurrir.

Cuando ocurre un error en un programa, se produce una excepcin, lo que significa que
crea un objeto excepcin y situa el puntero de la pila en el primer punto donde se ha
provocado la excepcin. El objeto excepcin contiene informacin sobre todo lo que ha
ocurrido.

Esto nos permite crear aplicaciones ms robustas ya que se puede llegar a averiguar el lugar
en concreto donde se ha producido el error, particularmente en reas donde los errores
puedan causar la perdida de datos y recursos del sistema.

Cuando creamos una respuesta a la excepcin tenemos que hacerlo en dentro de bloques de
cdigo, los cuales se llaman bloques de cdigo protegidos.

DEFINIENDO BLOQUES DE CODIGO PROTEGIDOS

Los bloques de cdigo protegidos comienzan con la palabra reservada try. Si ocurre algn
error dentro del bloque de cdigo protegido, el tratamiento del error se introduce en un
bloque de cdigo que comienza con except.

Vamos a ver un ejemplo que provoca una excepcin al abrir un archivo que no existe:

var
F: TextFile;
begin
AssignFile( F, 'c:\nosexiste.txt' );

try
Reset( F );
except
on E: Exception do
Application.MessageBox( PChar( E.Message ), 'Error', MB_ICONSTOP );
end;
end;

La primera parte de un bloque protegido comienza con la palabra try. El bloque try
contiene el cdigo que potencialmente puede provocar la excepcin. Al provocar la
excepcin saltar directamente al comienzo del bloque de cdigo que comienza con la
palabra reservada except.
Como puede apreciarse en el cdigo anterior hemos creado un objeto E que representa la
excepcin creada. El objeto E pertenece a la clase Exception que a su vez hereda
directamente de la clase TObject. Este objeto contiene propiedades y mtodos para
manejar la excepcin provocada.

PROVOCANCO NUESTRA PROPIA EXCEPCION

Nosotros tambin podemos crear nuestras propias excepciones que hereden de la clase
Exception. Por ejemplo, voy a crear una excepcin si una variable de tipo string est vaca.
Primero defino el tipo especial de excepcin:

type
ECadenaVacia = class( Exception );

Y ahora la provoco en el programa:

var
sCadena: String;
begin
if sCadena = '' then
raise ECadenaVacia.Create( 'Cadena vacia.' );
end;

El comando raise provoca a propsito la excepcin para detener la ejecucin del programa.
No es necesario que creemos nuestros tipos de excepcin. Tambin poda haber sido as:

if sCadena = '' then


raise Exception.Create( 'cadena vacia' );

Cuando se provoca una excepcin la variable global ErrorAddr declarada dentro de la


unidad System contiene un puntero a la direccin de memoria donde se ha provocado el
error. Esta variable es de slo lectura a ttulo informativo.

Como manejar excepciones en Delphi (y II)


Una vez que hemos visto lo que es una excepcin y cmo proteger nuestro cdigo usando
bloques protegidos vamos a pasar a ver como pueden meterse unas excepciones dentro de
otras para dar ms seguridad a nuestro cdigo. Es lo que se llaman excepciones anidadas.

EXCEPCIONES ANIDADAS

Vamos a ver un ejemplo de como anidar una excepcin dentro de otra:

var
F: TextFile;
begin
AssignFile( F, 'C:\noexiste.txt' );

try
Reset( F );

try
CloseFile( F );
except
on E: Exception do
ShowMessage( 'Excepcin 2: ' + E.Message );
end;

except
on E: Exception do
ShowMessage( 'Excepcin 1: ' + E.Message );
end;
end;

En este ejemplo hemos metido un bloque protegido dentro de otro, donde cada uno controla
su propia excepcin. En este caso provocara la excepcin 1 ya que el archivo no existe.

DETENIENDO LA EXCEPCION

Cuando se provoca una excepcin, una vez la hemos procesado con la sentencia on E:
Exception, la ejecucin continua hacia el siguiente bloque de cdigo. Si queremos detener
la ejecucin del programa debemos utilizar el comando raise:

var
F: TextFile;
begin
AssignFile( F, 'C:\noexiste.txt' );
ShowMessage( '1' );

try
Reset( F );

except
on E: Exception do
raise;
end;

ShowMessage( '2' );
end;

En este ejemplo nunca llegara a ejecutarse el segundo ShowMessage ya que raise detiene
la ejecucin del procedimiento.
De este modo se controla la excepcin y el usuario no ve nada en pantalla.
Con esto finalizamos el tratamiento de excepciones en Delphi.

Anda mungkin juga menyukai