ES

www.codigo-facil.com > Manejo de excepciones en Delphi

Excepciones en Delphi


Veremos como manejar las diferentes excepciones que puedan producirse en nuestros programas y evitar asi errores inesperados.

Introduccion


Las excepciones en programacion son una serie de errores que surgen en tiempo de ejecucion a causa de algun fallo producido por nuestro programa. Estos fallos pueden ser derivados desde una simple operacion no valida, como puede ser una division por cero, hasta una violacion en el acceso a una direccion de memoria.

Las excepciones pueden provocar diferentes consecuencias dependiendo de su gravedad, desde el tipico mensaje de error que tanto odiamos los programadores, hasta el cuelgue total de la aplicacion.

Delphi como la gran mayoria de lenguajes de programacion ponen a nuestra disposicion unas rutinas que nos permite el manejo de estas excepciones pudiendo asi anticiparnos al problema evitando de esta forma el posible error. Esto nos permite crear aplicaciones mas robustas y profesionales cara al cliente.

Como se implementan las excepciones?


Para tratar o capturar una excepecion tenemos que crear lo que se conoce como bloques de codigo protegido.

Estos bloques de codigo los podemos montar de dos formas diferentes :
  • Bloques con try..except..end;
  • Bloques con try..finally..end;
Como podemos ver ambas estructuras empiezan con la clausula try. Es aqui donde colocaremos el codigo susceptible de provocar la excepcion o el error. La diferencia entre ambos reside en como se ejecuta el codigo despues de las clausulas except o finally.

En el caso que utilicemos except el codigo solo sera ejecutado si se produjera la excepcion dentro de try. Mientras que si utlizamos finally este bloque de codigo siempre se ejecutara, se produzca o no la excepcion.
Ejemplos con try..except..end;

Para la realizacion de todos los ejemplos vamos a utiliizar un codigo que realiza una operacion no valida, como es la division por 0, para provocar asi la excepcion.

Primer ejemplo probocando la excepcion y mostrando el mensaje de error generado automaticamente por Delphi, deteniendo la ejecucion logica del programa con la utilizacion de raise.

  1. (...)
  2. var
  3.    dividendo, divisor, resultado : real;
  4. begin
  5.    dividendo := 4;
  6.    divisor := 0;
  7.    resultado := 0;
  8.   {
  9.   bloque try..except..end;
  10.   recordar que el codigo dentro de except solo se ejecuta si se produce la excepcion
  11.   }
  12.    try
  13.       //codigo suceptible de provacar la excepcion
  14.       resultado := dividendo/divisor;
  15.    except
  16.       //con raise se pide a delphi que muestre el mensaje de error segun la excepcion
  17.       raise;
  18.    end;

  19.   showmessage('El resultado es : ' + floattostr(resultado));

  20. end;
Segundo ejemplo con la deteccion del tipo de excepcion y la visualizacion de un mensaje de error personalizado.

  1. (...)
  2. var
  3.     dividendo, divisor, resultado : real;
  4. begin
  5.     dividendo := 4;
  6.     divisor := 0;
  7.     resultado := 0;

  8.     try
  9.        resultado := dividendo/divisor;
  10.     except
  11.       {
  12.       Verifico el tipo de excepcion producido, si es la que estamos tratando
  13.       doy un mensaje personalizado, si alguna otra muestro un mensaje generico
  14.       con el texto que me genera la excepcion.
  15.       }
  16.        on E : EDivByZero do
  17.        begin
  18.           showmessage('No se puede dividir un numero por 0');
  19.        end;
  20.        on E :exception do
  21.        begin
  22.          ShowMessage ('Se ha producido un error: ' + chr(13) + chr(13) +
  23.             'Clase de error: ' + E.ClassName + chr(13) + chr(13) +
  24.             'Mensaje del error: ' + E.Message);
  25.        end;

  26.     end;

  27.    showmessage('El resultado es : ' + floattostr(resultado));
  28.  
  29. end;
Tercer ejemplo mostrando un mensaje personalizado, pero sin intentar detectar el tipo de excepcion :

  1. (...)
  2. var
  3.    dividendo, divisor, resultado : real;
  4. begin
  5.    dividendo := 4;
  6.     divisor := 0;
  7.     resultado := 0;
  8.     {
  9.     bloque try..except..end;
  10.     recordar que el codigo dentro de except solo se ejecuta si se produce la excepcion
  11.    }
  12.    try
  13.       //codigo suceptible de provacar la excepcion
  14.       resultado := dividendo/divisor;
  15.    except
  16.       showmessage('Se ha producido un error en el programa');
  17.    end;
  18.  
  19.    showmessage('El resultado es : ' + floattostr(resultado));
  20.  
  21. end;
Si nos fijamos en los ejemplos que acabamos de ver, todos terminan mostrando un mensaje con el resultado de la division. Sin embargo si hemos probado los 3 casos, nos damos cuenta que solo en los 2 ultimos vemos que realmente se muestra el mensaje. Esto es por que en el primero la utilizacion de raise; proboca la visualizacion del mensaje de error por defecto junto con la finalizacion de la ejecucion logica del programa.

En caso de que quisiaramos el mismo resultado en los otros 2 casos basta con añadir la instruccion abort; en el bloque definido por except..end; para que automaticamente el programa detenga las instrucciones posteriores a la excepcion. Os invito a que probeis alguno de los 2 ultimos casos con la utilizacion de abort; para que veais la diferencias de ejecucion.

El codigo del ultimo ejemplo con la utilizacion de abort quedaria de la siguiente forma :

  1. (...)
  2. var
  3.    dividendo, divisor, resultado : real;
  4. begin
  5.     dividendo := 4;
  6.     divisor := 0;
  7.     resultado := 0;
  8.     {
  9.     bloque try..except..end;
  10.     recordar que el codigo dentro de except solo se ejecuta si se produce la excepcion
  11.     }
  12.     try
  13.        //codigo suceptible de provacar la excepcion
  14.        resultado := dividendo/divisor;
  15.     except
  16.        showmessage('Se ha producido un error en el programa');

  17.        {
  18.        Con abort se detiene la ejecucion posterior de instrucciones
  19.        ya no ejecuta el mensaje que visuliza el resultdo
  20.        }
  21.        abort;
  22.     end;

  23.     showmessage('El resultado es : ' + floattostr(resultado));

  24. end;

Ejemplo con try..finally..end;

Este caso es mas sencillo que el anterior ya que esta vez el bloque de codigo que incluyamos entre las clausulas finally..end; se ejecutara siempre, aunque no se produzca la excepcion. Ademas comentar que en caso de producirse la excepcion se detendria la ejecucion logica del programa.

A continuacion vamos a ver como que quedaria el ejemplo anterior con la utilizacion de try..finally..end;

  1. (...)
  2. var
  3.    dividendo, divisor, resultado : real;
  4. begin
  5.     dividendo := 4;
  6.     divisor := 0;
  7.     resultado := 0;
  8.     {
  9.     bloque try..finally..end;
  10.     recordar que el codigo dentro de except solo se ejecuta si se produce la excepcion
  11.     }
  12.     try
  13.        //codigo suceptible de provacar la excepcion
  14.        resultado := dividendo/divisor;
  15.     finally
  16.       showmessage('El resultado es : ' + floattostr(resultado));
  17.     end;

  18. end;
Con este ultimo ejemplo hemos llegado al final de este articulo espero que os haya resultado util. Aqui me despido, gracias a tod@s por vuestro apoyo y nos vemos en futuras publicaciones.

Ultimas noticias

Crea tu propio framework en javascript

Recopilacion de articulos donde mostrare paso a paso como podemos crear nuestro propio framework en javascript, totalmente funcional y listo para ser utilizado en nuestros futuros proyectos.

Para mas informacion :

Tutorial para crear tu propio FrameWork en JavaSript

Más información
13/12/2013 11:42:57

Como crear una DLL en delphi?

En esta serie de 2 capitulos veremos como crear y utilizar una DLL en Delphi.

Abajo os dejo los enlaces a estos 2 capitulos que componen este mini tutorial, espero que sea de vuestro agrado :

Capitulo 1 : Creacion y utilizacion de una DLL

Capitulo 2 : Creacion de un formulario dinamico utilizando una DLL
Más información
19/09/2013 17:35:59

Ya puedes publicar tu opinion

A partir de ahora ya puedes comentar todas las publicaciones que encuentres en el portal.

Podras opinar tanto si algo te gusta como si no, o si crees que es conveniente completar alguna publicacion, ya que la encuentras incompleta o erronea.

O simplemente por si nos quieres felictar por algo bien hecho :-).

Valoraremos cualquier critica que nos puedas hacer.
Más información
20/05/2013 15:30:10

Tutorial PHP5

Fundamentos de la programacion orientada a objetos
Un interesante tutorial repartido en una serie de capitulos donde se tratan los conocimientos basicos de la programacion orientada a objetos (POO) en PHP5.

Para mayor informacion siga el siguiente enlace :

Tutorial POO en PHP

Más información
04/09/2013 15:44:29
0