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, "Uno");
-- ...
Raise_Exception (Fallo_Válvula'Identity, "Dos");
-- ...
exception∞
when∞ Evento: Fallo_Válvula =>
Put(Exceptions_Message(Evento));
end∞;
Especificación de Ada.Exceptions
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