Debe introducir al menos 3 caracteres en el buscador.
Inicio / Wikis / Cursos gratis / Curso de Ada - Excepciones

Curso de Ada - Excepciones

 ****- (10 opiniones)
GNU Free Documentation License Curso gratis de José Alfonso Malo Romero - 16 de Marzo de 2006
Temas Relacionados: Programación estructurada
49. Excepciones
En Ada, cuando se produce algún error durante la ejecución de un programa, se eleva una excepción. Dicha excepción puede provocar la terminación abrupta del programa, pero se puede controlar y realizar las acciones pertinentes. También se pueden definir nuevas excepciones que indiquen distintos tipos de error.

Excepciones predefinidas


En Ada, dentro del paquete Standard, existen unas excepciones predefinidas, éstas son:

Constraint_Error cuando se intenta violar una restricción impuesta en una declaración, tal como indexar más allá de los límites de un array o asignar a una variable un valor fuera del rango de su subtipo. Program_Error se produce cuando se intenta violar la estructura de control, como cuando una función termina sin devolver un valor. Storage_Error es elevada cuando se requiere más memoria de la disponible. Tasking_Error cuando hay errores en la comunicación y manejo de tareas. Numeric_Error en Ada 83 se podía presentar cuando ocurría un error aritmético. A partir del estándar Ada 95, desaparece por motivos de portabilidad y pasa a ser un renombrado de Constraint_Error. Por ejemplo, en Ada 83 al dividir entre cero podía saltar Constraint_Error o Numeric_Error (dependiendo del compilador). En Ada 95 este error siempre levanta Constraint_Error.

Manejador de excepciones


Cuando se espere que pueda presentarse alguna excepción en parte del código del programa, se puede escribir un manejador de excepciones en las construcciones que lo permitan (bloques o cuerpos de subprogramas, paquetes o tareas), aunque siempre está el recurso de incluir un bloque en cualquier lugar del código. Su sintaxis sería:

manejador_excepción ::= when [ identificador : ] elección_excepción { | elección_excepción } => secuencia_sentencias elección_excepción ::= identificador | others

La palabra reservada others indica cualquier otra excepción y debe ser la única y última opción.

A la sentencia que comienza por when, se le denomina manejador de excepción.

Por ejemplo, en un bloque:

begin -- ... exception when Constraint_Error => Put ("Error de rango."); when Program_Error | Tasking_Error => Put ("Error de flujo."); when others => Put ("Otro error."); end;

En el momento en el que se produzca la elevación de Constraint_Error durante la ejecución de la secuencia de sentencias entre begin y exception, inmediatamente se interrumpe el flujo de control y se transfiere éste a la secuencia de sentencias que siguen a la palabra reservada => del manejador correspondiente.

Otro ejemplo con una función:

function Mañana (Hoy: TDía) return TDía is begin return TDía'Succ(Hoy); exception when Constraint_Error => return TDía'First; end Mañana;

Nótese que no se puede devolver nunca el control a la unidad donde se elevó la excepción. Cuando se termina la secuencia de sentencias del manejador, termina también la ejecución de dicha unidad.

Si no se controla una excepción, ésta se propaga dinámicamente por las sucesivas unidades invocantes hasta que se maneje en otra o directamente termina la ejecución del programa proporcionando un mensaje con la excepción provocada por pantalla.

Declaración y elevación de excepciones


Normalmente, es probable prever una situación de error que no se encuentra entre las excepciones predefinidas, por ello, se puede declarar excepciones. Por ejemplo:

Error: exception;

Con lo que se puede elevar dicha excepción en el momento pertinente mediante la sentencia raise, cuya sintaxis es:

elevación_excepción ::= raise [ identificador ] ;

Por ejemplo, en un paquete de manejo de una pila estática de números enteros:

package Pila_enteros is ErrorPilaEnteros: exception; procedure Poner (X: Integer); function Quitar return Integer; end Pila_enteros; package body Pila_enteros is Max: constant := 100; Pila: array (1..Max) of Integer; Cima: Integer range 0..Max; procedure Poner (X: Integer) is begin if Cima = Max then raise ErrorPilaEnteros; -- Se eleva la excepción. end if; Cima := Cima + 1; P(Cima) := X; end Poner; function Quitar return Integer is begin if Cima = 0 then raise ErrorPilaEnteros; -- Se eleva la excepción. end if; Cima := Cima - 1; return Pila(Cima+1); end Quitar; begin Cima := 0; end Pila_enteros;

Obsérvese que no hace falta else en la sentencias if, pues al elevar la excepción, finaliza la ejecución del subprograma.

Ahora se podría escribir:

declare use Pila_enteros; begin Poner (5); -- ... exception when ErrorPilaEnteros => -- ... Manipulación incorrecta de la pila. when others => -- ... end;

Si se quiere que dicha excepción no se propague más allá de la unidad en la que se elevó pero no se quiere manejar, se puede emplear una única sentencia vacía (null) dentro de su manejador correspondiente:

procedure Vaciar_pila_enteros is Basura: Integer; use Pila_enteros; begin loop Basura := Quitar; end loop; exception when ErrorPilaEnteros => null; end Vaciar_pila_enteros;

Aunque esto no evitaría que se terminara la ejecución de la unidad.

En el caso en el que se quiera propagar una excepción después de haber ejecutado las sentencias pertinentes, se incluiría una sentencia raise dentro del manejador:

-- ... exception when ErrorPilaEnteros => Put ("Pila utilizada incorrectamente."); Vaciar_pila_enteros; raise ErrorProcesamieto; -- Se propaga otra excepción. end;

En este caso se propaga otra excepción, pero podría haber sido la misma simplemente con raise, sin crear una nueva ocurrencia de la excepción, por ejemplo:

-- ... exception when FalloEnVálvula => Put ("Se ha producido un fallo en la válvula."); raise; -- Se propaga la misma excepción del manejador. end;

Así, se puede realizar un manejo de la excepción en varias capas, realizando sucesivas acciones en cada una de ellas. Dicha sentencia raise sin argumentos debe ser invocada directamente en el manejador, no es posible invocarla en un procedimiento llamado por el manejador.




Información de la excepción


Ada proporciona información sobre una determinada excepción haciendo uso del paquete predefinido Ada.Exceptions y tras obtener la ocurrencia de la excepción mediante esta notación:

when Ocurrencia : ErrorSensor => Put_Line (Ada.Exceptions.Exception_Information (Ocurrencia));

Manual de referencia de Ada


En Ada, cuando se produce algún error durante la ejecución de un programa, se eleva una excepción. Dicha excepción puede provocar la terminación abrupta del programa, pero se puede controlar y realizar las acciones pertinentes. También se pueden definir nuevas excepciones que indiquen distintos tipos de error.

Excepciones predefinidas

En Ada, dentro del paquete Standard, existen unas excepciones predefinidas, éstas son:
Constraint_Error cuando se intenta violar una restricción impuesta en una declaración, tal como indexar más allá de los límites de un array o asignar a una variable un valor fuera del rango de su subtipo. Program_Error se produce cuando se intenta violar la estructura de control, como cuando una función termina sin devolver un valor. Storage_Error es elevada cuando se requiere más memoria de la disponible. Tasking_Error cuando hay errores en la comunicación y manejo de tareas. Numeric_Error en Ada 83 se podía presentar cuando ocurría un error aritmético. A partir del estándar Ada 95, desaparece por motivos de portabilidad y pasa a ser un renombrado de Constraint_Error. Por ejemplo, en Ada 83 al dividir entre cero podía saltar Constraint_Error o Numeric_Error (dependiendo del compilador). En Ada 95 este error siempre levanta Constraint_Error.

Manejador de excepciones

Cuando se espere que pueda presentarse alguna excepción en parte del código del programa, se puede escribir un manejador de excepciones en las construcciones que lo permitan (bloques o cuerpos de subprogramas, paquetes o tareas), aunque siempre está el recurso de incluir un bloque en cualquier lugar del código. Su sintaxis sería:
manejador_excepción ::= when [ identificador : ] elección_excepción { | elección_excepción } => secuencia_sentencias elección_excepción ::= identificador | others
La palabra reservada others indica cualquier otra excepción y debe ser la única y última opción.
A la sentencia que comienza por when, se le denomina manejador de excepción.
Por ejemplo, en un bloque:
begin -- ... exception when Constraint_Error => Put ("Error de rango."); when Program_Error | Tasking_Error => Put ("Error de flujo."); when others => Put ("Otro error."); end;
En el momento en el que se produzca la elevación de Constraint_Error durante la ejecución de la secuencia de sentencias entre begin y exception, inmediatamente se interrumpe el flujo de control y se transfiere éste a la secuencia de sentencias que siguen a la palabra reservada => del manejador correspondiente.
Otro ejemplo con una función:
function Mañana (Hoy: TDía) return TDía is begin return TDía'Succ(Hoy); exception when Constraint_Error => return TDía'First; end Mañana;
Nótese que no se puede devolver nunca el control a la unidad donde se elevó la excepción. Cuando se termina la secuencia de sentencias del manejador, termina también la ejecución de dicha unidad.
Si no se controla una excepción, ésta se propaga dinámicamente por las sucesivas unidades invocantes hasta que se maneje en otra o directamente termina la ejecución del programa proporcionando un mensaje con la excepción provocada por pantalla.

Declaración y elevación de excepciones

Normalmente, es probable prever una situación de error que no se encuentra entre las excepciones predefinidas, por ello, se puede declarar excepciones. Por ejemplo:
Error: exception;
Con lo que se puede elevar dicha excepción en el momento pertinente mediante la sentencia raise, cuya sintaxis es:
elevación_excepción ::= raise [ identificador ] ;
Por ejemplo, en un paquete de manejo de una pila estática de números enteros:
package Pila_enteros is ErrorPilaEnteros: exception; procedure Poner (X: Integer); function Quitar return Integer; end Pila_enteros; package body Pila_enteros is Max: constant := 100; Pila: array (1..Max) of Integer; Cima: Integer range 0..Max; procedure Poner (X: Integer) is begin if Cima = Max then raise ErrorPilaEnteros; -- Se eleva la excepción. end if; Cima := Cima + 1; P(Cima) := X; end Poner; function Quitar return Integer is begin if Cima = 0 then raise ErrorPilaEnteros; -- Se eleva la excepción. end if; Cima := Cima - 1; return Pila(Cima+1); end Quitar; begin Cima := 0; end Pila_enteros;
Obsérvese que no hace falta else en la sentencias if, pues al elevar la excepción, finaliza la ejecución del subprograma.
Ahora se podría escribir:
declare use Pila_enteros; begin Poner (5); -- ... exception when ErrorPilaEnteros => -- ... Manipulación incorrecta de la pila. when others => -- ... end;
Si se quiere que dicha excepción no se propague más allá de la unidad en la que se elevó pero no se quiere manejar, se puede emplear una única sentencia vacía (null) dentro de su manejador correspondiente:
procedure Vaciar_pila_enteros is Basura: Integer; use Pila_enteros; begin loop Basura := Quitar; end loop; exception when ErrorPilaEnteros => null; end Vaciar_pila_enteros;
Aunque esto no evitaría que se terminara la ejecución de la unidad.
En el caso en el que se quiera propagar una excepción después de haber ejecutado las sentencias pertinentes, se incluiría una sentencia raise dentro del manejador:
-- ... exception when ErrorPilaEnteros => Put ("Pila utilizada incorrectamente."); Vaciar_pila_enteros; raise ErrorProcesamieto; -- Se propaga otra excepción. end;
En este caso se propaga otra excepción, pero podría haber sido la misma simplemente con raise, sin crear una nueva ocurrencia de la excepción, por ejemplo:
-- ... exception when FalloEnVálvula => Put ("Se ha producido un fallo en la válvula."); raise; -- Se propaga la misma excepción del manejador. end;
Así, se puede realizar un manejo de la excepción en varias capas, realizando sucesivas acciones en cada una de ellas. Dicha sentencia raise sin argumentos debe ser invocada directamente en el manejador, no es posible invocarla en un procedimiento llamado por el manejador.


Información de la excepción

Ada proporciona información sobre una determinada excepción haciendo uso del paquete predefinido Ada.Exceptions y tras obtener la ocurrencia de la excepción mediante esta notación:
when Ocurrencia : ErrorSensor => Put_Line (Ada.Exceptions.Exception_Information (Ocurrencia));

Manual de referencia de Ada

Tabla de contenidos
  1. 1 - Introducción
  2. 2 - Historia
  3. 3 - Manual de referencia
  4. 4 - Instalación
  5. 5 - Hola Mundo
  6. 6 - Elementos del lenguaje
  7. 7 - Tipos
  8. 8 - Enteros
  9. 9 - Enumeraciones
  10. 10 - Coma flotante
  11. 11 - Coma fija
  12. 12 - Arrays
  13. 13 - Strings
  14. 14 - Registros
  15. 15 - Registros discriminados
  16. 16 - Registros variantes
  17. 17 - Punteros a objetos
  18. 18 - Punteros a subprogramas
  19. 19 - Tipos derivados
  20. 20 - Tipos etiquetados (orientación a objetos)
  21. 21 - Subtipos
  22. 22 - Objetos (variables y constantes)
  23. 23 - Atributos
  24. 24 - Expresiones
  25. 25 - Operadores
  26. 26 - Sentencias y estructuras de control
  27. 27 - Subprogramas
  28. 28 - Sobrecarga
  29. 29 - Entrada/salida
  30. 30 - Pragmas
  31. 31 - Interfaz con otros lenguajes
  32. 32 - Diseño y programación de sistemas grandes
  33. 33 - Paquetes
  34. 34 - Clausula use
  35. 35 - Clausula with
  36. 36 - Paquete Standard
  1. 37 - Declaraciones
  2. 38 - Ámbito
  3. 39 - Visibilidad
  4. 40 - Renombrado
  5. 41 - La biblioteca Ada (unidades y subunidades)
  6. 42 - Unidades de biblioteca
  7. 43 - Unidades hijas
  8. 44 - Subunidades
  9. 45 - Compilación separada y dependiente
  10. 46 - Tipos abstractos de datos
  11. 47 - Tipos limitados
  12. 48 - Unidades genéricas
  13. 49 - Excepciones
  14. 50 - Paquete Ada.Exceptions
  15. 51 - Concurrencia
  16. 52 - Tareas
  17. 53 - Sincronización de tareas mediante puntos de entrada o citas (entry)
  18. 54 - Aceptación de citas (accept)
  19. 55 - Selección de citas (select)
  20. 56 - Llamadas a punto de entrada complejas
  21. 57 - Tareas dinamicas: creación dinamica de tareas (tipos t
  22. 58 - Dependencia de tareas
  23. 59 - Ejemplos de tareas
  24. 60 - Programación distribuida con GLADE
  25. 61 - Novedades de Ada 2005
  26. 62 - Unidades predefinidas
  27. 63 - Paquete Ada.Strings.Fixed
  28. 64 - Paquete Ada.Strings.Unbounded
  29. 65 - Paquete Ada.Text_IO
  30. 66 - Paquete Ada.Text_IO.Editing
  31. 67 - Paquete Ada.Float_Text_IO
  32. 68 - Paquete Ada.Sequential_IO
  33. 69 - Paquete Ada.Command_Line
  34. 70 - Paquete Interfaces
  35. 71 - Recursos en la Web
Autor y licencia de 'Curso de Ada - Excepciones'
José Alfonso Malo Romero Extraído de: http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_Ada_/_Introducci%C3%B3n GNU Free Documentation License
El contenido está disponible bajo los términos de GNU Free Documentation License
Licencia GNU Free Documentation License: http://www.gnu.org/copyleft/fdl.html
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.

Wikis relacionados con 'Curso de Ada - Excepciones'

Excelente curso de iniciación a la astronomía para aquellos que quieran aprender sobre esta apasionante... Más »
La idea de este curso surgió de varias conversaciones entre amig@s de la cuadrilla y... Más »
Este es un curso tremendamente completo, guiado y con ejemplos y prácticas pensadas para convertirlo... Más »
Este tutorial presenta los conceptos básicos de líneas de transmisión (Transmission lines), así como una... Más »
Publicidad, término utilizado para referirse a cualquier anuncio destinado al público y cuyo objetivo es... Más »
Gente Wiki
Alexis Digón De La Cruz
Licenciado en contabilidad, graduado de idioma inglés, técnico en comunicaciones postales y telegráficas, informático con 22 años de experiencia, profesor...
Santiago
Soy consultor y asesor en ingeniería y administración y pienso que el compartir inquietudes es la base del desarrollo humano.
Innovación, Análisis estadístico,...
Fabian
Hola a todos. Soy analista de sistemas, docente y estudiante de la licenciatura en sistemas de la univ. Nac. De...
Pedagogía
Julio Fernandez
Veterano pero nunca experto. Hace 14 años, descubrí la profesión de soporte técnico y programador, después de muchos años de...
Análisis funcional de aplicaciones
Rosanna Hernandez
Soy biólogo, con un doctorado en ecología. Soy profesor universitaario y asesor de proyectos, ambientales, calidad, seguridad alimentaria.
Kitty Kahlo
Diseñador y administrador, profesor de corazón amo el enseñar historia del arte, me gusta aprender de la gente todo lo...
Suscribirse
¿Estás seguro de que deseas eliminar este capítulo?