Programación en Ada/Unidades predefinidas/Ada.Exceptions
Información sobre la excepción Editar
Ada proporciona información sobre una determinada excepción en un objeto del tipo Exception_Ocurrence, definido dentro del paquete predefinido Ada.Exceptions junto con otras funciones que toman como parámetro una ocurrencia de excepción.
- Exception_Name: devuelve el nombre del tipo de la excepción en notación de puntos completa en letra mayúscula, por ejemplo "PILA.ERROR".
- Exception_Message: devuelve un mensaje de una línea con la causa y la ubicación de la excepción. No contiene el nombre de la excepción.
- Exception_Information: devuelve una cadena que incluye el nombre de la excepción, la causa y la ubicación y debería proporcionar detalles de la traza de la excepción.
Para comunicar dicha ocurrencia, se emplea la siguiente notación, por ejemplo:
with Ada.Exceptions; use Ada.Exceptions; -- ... exception when Evento: PresiónElevada | TemperaturaElevada => Put ("Excepción: "); Put (Exception_Name(Evento)); New_Line; when Evento: others => Put ("Excepción no prevista: "); Put (Exception_Name(Evento)); New_Line; Put (Exception_Message(Evento)); end;
En ocasiones puede resultar útil almacenar una ocurrencia. Por ejemplo, sería útil crear un registro de las excepciones producidas en la ejecución de un programa almacenándolas en una lista o vector de ocurrencias. Nótese que el tipo Exception_Occurrence es limitado, de modo que no puede ser asignado para ser guardado. Por esta razón Ada.Exceptions proporciona el procedimiento y la función Save_Ocurrence.
El tipo Exception_Id puede entenderse como un tipo enumeración. Toda excepción declarada mediante la palabra reservada exception puede ser considerada como uno de los literales del tipo Exception_Id y, por lo tanto, tiene asociado una identificación, que es el literal correspondiente. Nótese que se refiere ahora a excepciones y a ocurrencias de las mismas. Los literales aludidos serían referencias a Constraint_Error, TemperaturaElevada, etc.; en general, las excepciones predefinidas y las declaradas. Cada una de ellas es en rigor uno de los valores que puede tomar el tipo Exception_Id. El atributo Identity proporciona la identificación de una excepción. Por ejemplo:
declare Fallo_Válvula: exception; Id: Ada.Exceptions.Exception_Id; begin -- ... Id := Fallo_Válvula'Identity; -- ... end;
El programador puede establecer su propio mensaje para una ocurrencia concreta elevándola mediante Raise_Exception en lugar de hacerlo con raise seguido del nombre de la excepción. Por ejemplo:
declare Fallo_Válvula : exception; begin -- ... Raise_Exception (Fallo_Válvula'Identity, "Error de apertura"); -- ... Raise_Exception (Fallo_Válvula'Identity, "Error de cierre"); -- ... exception when Evento: Fallo_Válvula => Put(Exception_Message(Evento)); end;
Esta llamada es equivalente en Ada 2005 a la siguiente sentencia:
raise Fallo_Válvula with "Error de apertura";
Especificación de Ada.Exceptions Editar
Según el manual de referencia de Ada el paquete Ada.Exceptions debe tener esta especificación:
package Ada.Exceptions is type Exception_Id is private; Null_Id : constant Exception_Id; function Exception_Name(Id : Exception_Id) return String; type Exception_Occurrence is limited private; type Exception_Occurrence_Access is access all Exception_Occurrence; Null_Occurrence : constant Exception_Occurrence; procedure Raise_Exception(E : in Exception_Id; Message : in String := ""); function Exception_Message(X : Exception_Occurrence) return String; procedure Reraise_Occurrence(X : in Exception_Occurrence); function Exception_Identity(X : Exception_Occurrence) return Exception_Id; function Exception_Name(X : Exception_Occurrence) return String; -- Same as Exception_Name(Exception_Identity(X)). function Exception_Information(X : Exception_Occurrence) return String; procedure Save_Occurrence(Target : out Exception_Occurrence; Source : in Exception_Occurrence); function Save_Occurrence(Source : Exception_Occurrence) return Exception_Occurrence_Access; private ... -- not specified by the language end Ada.Exceptions;