Guía mínima de Ada 95

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:     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:
  1. Capturarla
  2. Ignorarla
    Si se captura, entonces cabe:
  1. Controlarla, e intentar que el programa continúe su ejecución.
  2. 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.

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]