‒ Crear nuestra propia excepción.
En el capítulo 11.1, explique sobre el uso de excepciones, en este capítulo explicare como crear nuestra propia excepción.
Para crear nuestra propia excepción personalizada, es bastante sencillo sólo basta crear una clase que herede los atributos de la clase Exception. Como práctica habitual las clases que son Excepciones se escriben con la letra inicial E, el uso de la letra inicial E no forma parte de la sintaxis del compilador si no que es más bien una practica habitual entre los programadores.
El siguiente ejemplo es una modificación de la clase TNumeros que hemos visto en los capítulos anteriores, esta clase define una excepción EdatosInvalidos. Además para poder usar la excepción EDatosInvalidos, se debe crear un método PonCadE, primero en la clase TNumero como método abstracto y después en la clase TComplejo que sobreescribe al método abstracto. Con lo que tenemos la siguiente clase TNumero.
‒
Descargar
{$codepage utf8}
{$mode objfpc}
Unit Numeros02;
Interface
Uses sysutils,math;
Type
EDatosInvalidos = class(Exception)
End;
TClassNumero = class of TNumero;
TNumero = class
private
ParteReal,ParteImag:double;
Procedure PonComp(indice:integer;r:double);
Function ObtComp(indice:integer):double;
public
decimales:integer;
Constructor Crear(i:double);virtual;abstract;
Constructor Crear(r,i:double;dec:integer=0);virtual;abstract;
Function ObtCad(dec:integer=0):string;virtual;abstract;
Function PonCad(n:string):integer;virtual;abstract;
Procedure PonCadE(n:string);virtual;abstract;
Procedure Adicion(n:TNumero);virtual;abstract;
Procedure Sustracion(n:TNumero);virtual;abstract;
Procedure Division(n:TNumero);virtual;abstract;
Procedure Cuadrado(n:TNumero);virtual;abstract;
Procedure Cuadrado;virtual;abstract;
Function modulo:double;virtual;abstract;
Function argumento:double;virtual;abstract;
Procedure Potencia(n:integer);virtual;abstract;
Procedure Multiplicacion(n:TNumero);virtual;abstract;
Property Real:double index 1 read ObtComp write PonComp;
Property Imag:double index 2 read ObtComp write PonComp;
End;
Implementation
Procedure TNumero.PonComp(indice:integer;r:double);
Begin
if indice=1 then ParteReal:=r;
if indice=2 then ParteImag:=r
End;
Function TNumero.ObtComp(indice:integer):double;
Begin
if indice=1 then ObtComp:=ParteReal;
if indice=2 then ObtComp:=ParteImag
End;
End.
Código fuente 4: La Clase TNumero con la excepción EDatosInvalidos.
Descargar
El método PonCadE, que se debe implementar en la Clase TComplejo es el siguiente:
‒
Descargar
Procedure TComplejo.PonCadE(n:string);
Begin
if PonCad(n)<>0 then raise EDatosInvalidos.Create('Error datos no validos ingresados')
End;
Código fuente 5: Método PonCadE modificado de la clase TComplejo.
Descargar
PonCadE es un método que enmascara el método PonCad, y comprueba el valor devuelto por este y cuando es distinto de cero, nos dice que ha sucedido un error en la conversión, y lanza la excepción EDatosInvalidos, que se usará en el siguiente programa de ejemplo:
‒
Descargar
{$codepage utf8}
{$mode objfpc}
Uses Numeros02,Complejos08,Reales05;
Var
Ref:TClassNumero;
cad:string;
num1,num2:TNumero;
rpt,continuar:char;
Begin
continuar:='S';
Repeat
Writeln('Ingrese con que numeros quiere Multiplicar:');
Writeln('[1] Complejos');
Writeln('[2] Reales');
Readln(rpt);
Case rpt of
'1': Ref:=TComplejo;
'2': Ref:=TReal;
End;
try
Write('Ingrese el primer numero ');readln(cad);
num1:=Ref.create;
num1.PonCadE(cad);
Write('Ingrese el segundo numero ');readln(cad);
num2:=Ref.create;
num2.PonCadE(cad);
num1.Multiplicacion(num2);
Writeln(num1.ObtCad(3));
except
on E:EDatosInvalidos do Writeln(E.Message);
end;
Write('¿Desea continuar Multiplicando?:');
Readln(continuar)
Until continuar in ['N','n']
End.
Código fuente 6: Programa de ejemplo que usa la excepción EDatosInvalidos.
Descargar
En este ejemplo hemos creado una excepción bastante simple, pero podemos hacerlo un poco más complejo como el siguiente ejemplo:
EDatosInvalidos = class(Exception)
Error:longint;
Constructor Crear(cad:string;perror:longint);
End;
.
..
...
Constructor EDatosInvalidos.Crear(cad:string;perror:longint);
Begin
inherited create(cad);
Error:=perror;
End;
en donde, como se puede observar se añadió el atributo Error y un constructor propio que permite manejar el error sucedido. Obviamente luego se debe cambiar el método PonCadE, para que procese el error, del siguiente modo:
‒
Descargar
Procedure TComplejo.PonCadE(n:string);
var error:longint;
Begin
error:=PonCad(n);
if error<>0 then raise EDatosInvalidos.Crear('Error datos no validos ingresados',error)
End;
Código fuente 7: Uso de EDatosInvalidos con el constructor Crear.
Descargar
Con esto el programa ya podrá enviar el mensaje de error adecuado cuando suceda el error, al final el programa de ejemplo quedaría así:
‒
Descargar
{$codepage utf8}
{$mode objfpc}
Uses Numeros02,Complejos08,Reales05;
Var
Ref:TClassNumero;
cad:string;
num1,num2:TNumero;
rpt,continuar:char;
Begin
continuar:='S';
Repeat
Writeln('Ingrese con que numeros quiere Multiplicar:');
Writeln('[1] Complejos');
Writeln('[2] Reales');
Readln(rpt);
Case rpt of
'1': Ref:=TComplejo;
'2': Ref:=TReal;
End;
try
Write('Ingrese el primer numero ');readln(cad);
num1:=Ref.create;
num1.PonCadE(cad);
Write('Ingrese el segundo numero ');readln(cad);
num2:=Ref.create;
num2.PonCadE(cad);
num1.Multiplicacion(num2);
Writeln(num1.ObtCad(3));
except
on E:EDatosInvalidos do Begin
Writeln(E.Message);
Writeln('posición del error : ',E.error)
End
end;
Write('¿Desea continuar Multiplicando?:');
Readln(continuar)
Until continuar in ['N','n']
End.
Código fuente 8: Programa de ejemplo que usa la excepción EDatosInvalidos que tiene un cosntructor Crear.
Descargar
Los códigos completos de los ejemplos explicados en este capítulo lo pueden descargar desde aquí.
Última revisión: 14/04/2014.