Programación en Ada/Unidades predefinidas/Ada.Exceptions

← Excepciones Paquete Ada.Exceptions Concurrencia →


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;

Manual de referencia de Ada

editar