Transparencias de excepciones

Anuncio
Excepciones Predefinidas (I)
•
Excepciones
Javier Miranda, Luis Hernández, Francisco Guerra
[email protected]
[email protected]
[email protected]
Constraint_Error: Se eleva cuando se incumple alguna de
las restricciones que hemos puesto en nuestro programa, o
sea:
1. Se asigna a una variable un valor fuera del rango
permitido (Por ejemplo, se intenta asignar una valor
negativo a un número positivo).
2. Se accede mediante un indice fuera del rango de un
array.
3. Se utiliza mal un atributo (Ejemplo: Integer’Value
("12X3")
4. Se asigna un array otro con diferente tamaño.
Saludo : String(1 .. 5) := "Hola";
Excepciones Predefinidas (II)
•
Numeric_Error: Se eleva cuando se produce un
desbordamiento en una operación aritmética o una
división por cero.
Program_Error: Se eleva cuando se ha producido algún
error de programación que no pudo ser detectado en
tiempo de compilación. Por ejemplo, cuando una función
termina sin ejecutar ninguna sentencia return.
Storage_Error: Se eleva cuando se hay algún problema de
falta de memoria. Por ejemplo, cuando se ha creado un
procedimiento recursivo que no finaliza nunca o cuando
creamos una tabla demasiado grande para la memoria de
nuestro ordenador.
Tasking_Error: Veremos en detalle esta excepción en
cursos posteriores.
•
•
•
Excepciones Predefinidas de Text_IO
•
Las excepciones más frecuentes son:
Data_Error: Has intentado leer un dato que no puede
interpretarse correctamente (ejemplo en la transparencia
siguiente)
– Mode_Error: Has intentado leer de un fichero abierto en
modo OUT_FILE o APPEND_FILE, o escribir en un
fichero abierto en modo IN_FILE
– Name_Error: Has intentado abrir un fichero que no existe
en el disco, o crear un fichero con un nombre que no es
válido.
– Status_Error: Has intentado utilizar un fichero que aún no
has abierto, o has intentado abrir un fichero que ya estaba
abierto.
– End_Error: Has intentado leer cuando ya has llegado al
final del fichero.
... y algunas más que por ahora no necesitamos.
–
Manejador de Excepciones
Ejemplo 1
with Text_IO;
procedure Escribir_Cuadrado is
package Int_IO is new Text_IO.Integer_IO (Integer);
Numero : Integer;
begin
Text_IO.Put ("Dame un numero entero: ");
Int_IO.Get (Numero);
Fijate que es similar al “case”
Text_IO.Put("El cuadrado es ... ");
Int_IO.Put (Numero*Numero);
exception
when Numeric_Error =>
Text_IO.Put_Line (" ... Escribiste un numero demasiado grande.");
end Escribir_Cuadrado;
Ejemp
lo
with Text_IO;
procedure Ejemplo_Leer_Numero is
package Int_IO is new Text_IO.Integer_IO (Integer);
Numero
: Integer;
Numero_Valido : Boolean := False;
begin
Fijate que puedes utilizar un bloque begin-end
...
para tener mejor control de los errores
loop
begin
Text_IO.Put ("Dame un numero entero: ");
Int_IO.Get (Numero);
Numero_Valido := True;
exception
when Text_IO.Data_Error =>
Text_IO.Put (“Te he dicho que un número entero!");
Text_IO.Skip_Line;
end;
exit when Numero_Valido;
end loop;
Int_IO.Put (Numero);
end Ejemplo_Leer_Numero;
Utilizo Skip_Line para tirar todo lo que
había leído desde el teclado; si no lo hago
el programa va a fallar porque aún está ahí
y es lo primero que voy a tener que leer.
1
Descargar