Excepciones Predefinidas (I) • Excepciones Javier Miranda, Luis Hernández, Francisco Guerra jmiranda@iuma.ulpgc.es lhernandez@iuma.ulpgc.es fguerra@iuma.ulpgc.es 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