Excepciones.
Introducción.
En la ejecución de un programa pueden darse muchas
situaciones inesperadas, bien errores, bien casos muy particulares no previstos.
Tener en cuenta todas las posibles situaciones anómalas oscurecería
los algoritmos. El mecanismo de manejo de excepciones permite controlar
estas situaciones sin tener que cargar con ese efecto indeseado.
Normalmente, la ocurrencia de un error causa la
terminación del programa con un mensaje indicando la excepción
ocurrida. En el estándar de Ada están definidas las siguientes
excepciones:
Constraint_error.- ocurre cuando se intenta asignar a una variable
un valor no válido, o cuando se intenta acceder a una posición
de un array fuera del rango permitido.
Program_error.- ocurre en situaciones extrañas cuando
parte de un programa no es accesible, o cuando se alcanza el "end" de una
función sin encontrar un "return".
Storage_error.- ocurre cuando se agota la memoria disponible.
Tasking_error.- está relacionado con errores en programas
que utilicen programación concurrente.
Las excepciones se lanzan automáticamente cuando
se produce un error. También pueden ser lanzadas manualmente mediante
una sentencia "raise" en cualquier lugar de un programa.
raise Constrain_error;
--produce la excepción Constrain_error
No es normal lanzar manualmente una excepción
predefinida; la utilidad de "raise" consiste en lanzar excepciones definidas
por el programador.
Declaración de excepciones.
La sintaxis de declaración de excepciones es
igual a la de declaración de variables (aunque una excepción
NO es una variable).
MiExcepción : exception;
Manejo de excepciones.
Cuando ocurre una excepción se puede:
-
Capturarla
-
Ignorarla
Si se captura, entonces cabe:
-
Controlarla, e intentar que el programa continúe su ejecución.
-
Reenviarla a otra parte del programa.
La captura de excepciones se realiza en una sección
que se inicia con la palabra "exception" y se puede situar al final de
cada bloque (begin..end). Dentro de esta
sección se utilizan sentencias "when NombreExcepción"
para capturar las distintas excepciones y situar el código que realiza
el tratamiento de las mismas.
Si se quiere relanzar la excepción, basta
con poner la sentencia "raise". Si se desea, se puede lanzar una nueva
excepción con "raise NombreExcepción".
begin
...
exception
when E1 =>
...
when E2|E3|...|En =>
...
when others =>
...
end;
Excepciones de entrada/salida.
En el paquete Text_IO se definen las siguientes excepciones
relacionadas con las operaciones de entrada/salida.
Status_Error.- ocurre cuando se intenta leer o escribir en un
fichero que no está abierto, o abrir un fichero que está
abierto.
Mode_Error.- ocurre cuando se intenta leer de un fichero que
está abierto para escritura o escribir en un fichero que está
abierto para lectura.
Name_Error.- ocurre cuando se intenta abrir un fichero y el
nombre externo es incorrecto.
Use_Error.- ocurre cuando se intenta abrir un fichero para un
uso ilegal (p.e. si se intenta crear un fichero con un nombre externo que
ya existe).
Device_Error.- ocurre cuando se produce un fallo técnico
en un dispositivo de entrada/salida.
End_Error.- ocurre cuando se intenta leer de un fichero en el
que se ha alcanzado la marca de fin de fichero.
Data_Error.- ocurre cuando se intenta leer un valor entero,
real o enumerado y los datos de entrada tienen un formato incorrecto.
Ejemplo.
with Text_IO;
use Text_IO;
procedure Excepciones is
package Entero_IO is new Integer_IO(Integer);
package Real_IO is new Float_IO(Float);
use Entero_IO, Real_IO;
División_por_cero: exception; --declaración
de excepción
procedure Leer(x,y: out integer) is
begin
loop
begin
put("Deme dos números enteros:
");
get(x); get(y);
exit;
exception
when Data_error => --se
controla la excepción y se
--recupera la ejecución del programa
put_line("Por
favor, teclee correctamente");
skip_line;
end;
end loop;
end Leer;
function Divide(x,y: in integer) return
float is
r: float;
begin
r := float(x) / float(y);
return r;
exception
when Constraint_error => --se
relanza una excepción más apropiada
raise División_por_cero;
end Divide;
a, b: integer;
begin
Leer(a,b);
put("El cociente es: "); put(Divide(a,b));new_line;
exception
when División_por_cero => --se
deja que el programa acabe de forma controlada
new_line;
put_line(" No
se puede dividir por cero");
end Excepciones;
[Anterior][Inicio][Siguiente]