next up previous contents
Siguiente: Resumen Subir: Excepciones Anterior: Declaración de excepciones   Índice General

Manejador de excepciones

Para capturar las excepciones utilizamos los manejadores de excepción. Para ello utilizamos la palabra reservada exception en medio de cualquier bloque begin-end y una estructura muy parecida a la de la sentencia case. Veamos como ejemplo un procedimiento que contiene un manejador para las excepciones predefinidas Constraint_Error y Numeric_Error y para la excepción Error definida por nosotros.

 with Text_IO;  
 procedure Ejemplo is 
    package Int_IO is new Text_IO.Integer_IO (Integer); 
    Numero: Integer; 
    Error : Exception; 
 begin 
    loop 
       Text_IO.Put ("Dame un numero positivo: ");
       Int_IO.Get (Numero); 
       if Numero <= 0 then 
          raise Error; 
       end if; 
       Text_IO.Put("El cuadrado es ... "); 
       Int_IO.Put (Numero*Numero); 
           -- Al hacer la multiplicacion Ada eleva la excepcion
           -- Constraint_Error or Numeric_Error si el resultado
           -- es demasiado grande.
    end loop; 
 exception 
    when Constraint_Error | Numeric_Error => 
       Text_IO.Put (" ... Demasiado grande."); 
    when Error => 
       Text_IO.Put ("Te dije POSITIVO !!");
 end Ejemplo;

Cuando se eleva una excepción Ada detiene la ejecución normal del programa y salta a ejecutar el manejador de excepciones. Si no lo hay, finaliza la ejecución del procedimiento, retorna al procedimiento que haya realizado la llamada (si lo hubo) y vuelve a buscar el manejador de excepciones. Este proceso se repite hasta que encuentre un manejador de excepciones. Si no encuentra ninguno, finaliza la ejecución de todo el programa y escribe en pantalla un error diciendonos cual fue la excepción que se elevó.

Al igual que ocurre en la sentencia case, podemos utilizar la barra vertical para expresar que varias excepciones tienen asociadas el mismo manejador. También podemos utilizar la expresión when others para expresar que en el caso de que sea cualquier otra excepción ejecute un determinado manejador.

Dentro del manejador de excepciones podemos reelevar la excepción. Para ello simplemente utilizamos la sentencia raise sin especificar ninguna excepción. Por ejemplo:

           when others => 
                 Text_IO.Put_Line("Error desconocido.");
                 raise;


next up previous contents
Siguiente: Resumen Subir: Excepciones Anterior: Declaración de excepciones   Índice General
Javier Miranda 2002-10-03