Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Excepc I Ones
Excepc I Ones
UPM
Excepciones
JuanAntoniodelaPuente
DIT/UPM
Transparenciasbasadasenelcaptulo6dellibrodeA.BurnsyA.WellingsRealTimeSystemsandProgrammingLanguuages,3edicin(2001)
Objetivos
Veremosalgunosmodelosdetratamientodeexcepciones
enlenguajesdeprogramacin
Tambinveremoscmoutilizarlasexcepcionespara
realizarsistemasquetoleranfallos
STRL
2001JuanAntoniodelaPuente
ndice
Tratamientodeexcepciones
mtodosprimitivos
mtodosavanzados
TratamientodeexcepcionesenAda
TratamientodeexcepcionesenJava
TratamientodeexcepcionesenC
Excepcionesybloquesderecuperacin
STRL
2001JuanAntoniodelaPuente
Introduccin
Unmecanismodeexcepcionesdebecumplirunaseriede
requisitos
serfcildeentenderydeusar
separacindecdigonormalycdigodetratamientode
excepciones
eficiencia(slodebehabersobrecostecuandosetratala
excepcin)
tratamientouniformedeexcepcionesdetectadasporelentornode
ejecucinyporelsoftwaredeaplicacin
accionesderecuperacinprogramables(noslopredefinidas)
STRL
2001JuanAntoniodelaPuente
Excepcionesenlenguajesprimitivos(1)
Cdigodeerrorenelresultadodeunsubprograma
Ejemplo:C
if ( function_call (params) != 0){
-- tratamiento de errores
} else {
-- actividad normal
};
Inconvenientes:
elcdigonoestseparadodelaactividadnormal
haysobrecostecuandonohayerrores
nosepuedentratarfcilmenteloserroresdelentorno
STRL
2001JuanAntoniodelaPuente
Excepcionesenlenguajesprimitivos(2)
Retornocondicional
Seusaenlenguajeensamblador
call ROUTINE
jmp ERROR_1
jmp ERROR_2
; tratamiento normal
Inconvenientes:
difcildeusaryentender
pocaabstraccin
difcildeintegrarconladeteccindeerroresporelentorno
STRL
2001JuanAntoniodelaPuente
Excepcionesenlenguajesprimitivos(3)
Saltoincondicionalglobal
Algunoslenguajespermitensaltaraotrapartedelprograma,fuera
delmdulodondeserealizaelsalto
Hayquecombinarloconunretornodesubprogramaanormal
difcildeusaryentender
pocoabstracto
STRL
2001JuanAntoniodelaPuente
Ejemplo(RTL/2)
svc data rrerr
label erl; %a label variable %
enddata
proc WhereErrorIsDetected();
...
goto erl;
...
endproc;
proc Caller();
...
WhereErrorIsDetected();
...
endproc;
proc main();
...
restart:
...
erl := restart;
...
Caller();
...
end proc;
STRL
2001JuanAntoniodelaPuente
Excepcionesenlenguajesprimitivos(4)
Variabledeprocedimiento
Elmanejadorsepasacomounprocedimientovariable
muydifcildeusarydemantener
enC++seusaunavariantedeestemtodoparaeltratamientode
excepcionescuandonohaymanejador(funcionespordefecto)
STRL
2001JuanAntoniodelaPuente
Ejemplo(RTL/2)
svc data rrerr;
label erl;
proc(int) erp; % erp is a
procedure variable %
enddata;
proc recover(int);
...
endproc;
proc main();
...
erl := fail;
erp := recover;
...
Caller();
...
fail:
...
end proc
proc WhereErrorIsDetected();
...
if recoverable then erp(n)
else goto erl end;
...
endproc;
proc Caller();
...
WhereErrorIsDetected();
...
endproc;
STRL
2001JuanAntoniodelaPuente
10
Excepcionesenlenguajesdemodernos
Sonelementosdelenguajequepermitenintegrarlosdos
tiposdedeteccindeerrores
deteccinporelentornodeejecucin
deteccinporelsoftwaredeaplicacin
Lasexcepcionespuedenser
sncronas
apareceninmediatamentecuandounprocesointentaejecutaruna
operacinincorrecta
asncronas
aparecenalgntiempodespus,enelprocesoqueintentla
operacinerrneaoenotrodistinto
STRL
2001JuanAntoniodelaPuente
11
Clasesdeexcepciones
Detectadasporelentorno,sncronas
ejemplos:errorenndicedearray,divisinporcero
Detectadasporlaaplicacin,sncronas
ejemplo:errorencomprobacindeasercin
Detectadasporelentorno,asncronas
ejemplo:averaendispositivoexterno
Detectadasporlaaplicacin,asncronas
ejemplo:deteccindelmitedetiempoenunaaccindeotro
proceso
Lasexcepcionesasncronassesuelenllamarseales
Lasveremosmsadelante
STRL
2001JuanAntoniodelaPuente
12
Excepcionessncronas
Lasexcepcionessepuedendeclarardevariasformas
conunnombreespecfico,deformasimilaraunaconstante
enestecasohacefaltaunadeclaracinexplcitadetodaslas
excepciones
ejemplo:Ada
comoobjetosdeuntipooclase
nosiemprehacefaltadeclaracinexplcita
ejemplo:Java
STRL
2001JuanAntoniodelaPuente
13
ExcepcionesenAda
EnAdasedeclaranconunnombre(nosonobjetos)
package Standard is
...
Constraint_Error
Program_Error
Storage_Error
Tasking_Error
...
end Standard;
:
:
:
:
exception;
exception;
exception;
exception;
Estasexcepcionesestnpredefinidas
Lasindicaelncleodeejecucin
STRL
2001JuanAntoniodelaPuente
14
ExcepcionesenJava
Lasexcepcionessonobjetosdeunaclase(Throwable)
Nohacefaltadeclararlosobjetosexplcitamente
Elcdigodeaplicacinoelentornodeejecucinpuedetirar
(throw)unaexcepcin
Elmanejadoratrapa(catch)laexcepcin
Debehacerreferenciaalaclaseoaunasuperclase
STRL
2001JuanAntoniodelaPuente
15
mbitodeunmanejador
Unamismaexcepcinpuedetenervariosmanejadoresen
unprograma
Cadamanejadortieneasociadounmbito
Setratadeunaregindonde,siseproducelaexcepcin,
seejecutaelmanejadorasociado
Enloslenguajesestructuradosenbloques,elmbitode
unmanejadorsueleserelbloquedondeestdeclarado
Tambinpuedeserunsubprograma
STRL
2001JuanAntoniodelaPuente
16
mbitodelosmanejadoresenAda
Losmanejadoressedeclaranalfinaldeunbloque,que
constituyeelmbitodelosmismos
declare
subtype Temperature is Integer range 0 .. 100;
begin
-- leer sensor y calcular un valor de temperatura
exception
-- manejador de Constraint_Error
end;
Losprocedimientos,funciones,yotrassecuenciasde
instrucciones,puedentambindefinirmbitosde
excepciones
STRL
2001JuanAntoniodelaPuente
17
mbitodelosmanejadoresenJava
Notodoslosbloquespuedentenermanejadores
Elmbitodeunmanejadorseindicaexplcitamente
medianteunbloqueguardado(tryblock)
try {
// instrucciones normales
}
catch (excepcion_type E) {
// manejador de excepcin
}
STRL
2001JuanAntoniodelaPuente
18
Resolucindeldominio
declare
subtype Temperature is Integer range 0 .. 100;
subtype Pressure
is Integer range 0 .. 50;
subtype Flow
is Integer range 0 .. 200;
begin
Read_Temperature_Sensor;
Read_Pressure_Sensor;
Read_Flow_Sensor;
Adjust_Values;
exception
-- manejador de Constraint_Error
end;
Elmanejadornopuedesaberdndeseelevlaexcepcin
STRL
2001JuanAntoniodelaPuente
19
Bloquesanidados
declare
...
begin
begin
Read_Temperature_Sensor;
exception
-- manejador de Constraint_Error
end;
begin
Read_Pressure_Sensor;
exception
-- manejador de Constraint_Error
end;
begin
Read_Flow_Sensor;
exception
-- manejador de Constraint_Error
end;
Adjust_values;
exception
-- manejador de Constraint_Error
end;
STRL
Eslargoypesado
2001JuanAntoniodelaPuente
20
Manejadoresasociadosainstrucciones
declare -- Ojo! No es Ada
...
begin
Read_Temperature_Sensor;
exception -- manejador de Constraint_Error
Read_Pressure_Sensor;
exception -- manejador de Constraint_Error
Read_Flow_Sensor;
exception -- manejador de Constraint_Error
end;
Adjust_values
exception -- manejador de Constraint_Error
end;
STRL
Mscompacto,perocdigonormalymanejadores
mezclados
Ejemplo:CHILL
2001JuanAntoniodelaPuente
21
Excepcionesconparmetros
Siseasociaunparmetroalaexcepcinqueindiqueel
puntodondesehaelevado,elmanejadorpuedeusaresta
informacin
Ada:procedimientospredefinidosquepermitenasociarun
mensajeaunaexcepcin
Java:sepuedeincluirlainformacinenladefinicindelaclasede
excepciones
STRL
2001JuanAntoniodelaPuente
22
Propagacindeexcepciones
Cuandonohaymanejadorenunbloquesepueden
hacervariascosas:
considerarlounerrordeprogramacin
muyrestrictivo
problemasconprocedimientos
propagarlaexcepcinalpuntodeinvocacin
sebuscaunmanejadorenelcontextodelpuntodondese
activelbloqueenquesehaproducidolaexcepcin
Unaexcepcinsepuedepropagarfueradesumbitode
visibilidad
solucin:manejadorespordefectoparaexcepciones
desconocidas
sienunprocesooenelprogramaprincipalquedasinmanejar
unaexcepcin,aborta
STRL
2001JuanAntoniodelaPuente
23
Reanudacinyterminacin
Cuandoelmanejadorterminasepuedenhacerdoscosas:
reanudarlaejecucindelbloque
terminarlaejecucindelbloqueydevolverelcontrolalpuntode
invocacin
Tambinhaymodeloshbridos
STRL
2001JuanAntoniodelaPuente
24
Modelodereanudacin
4
R
12
13
11
raiser
6
Hr
7
STRL
2001JuanAntoniodelaPuente
8
10
25
Crticadelmodelodereanudacin
Ventajas
Cuandolaexcepcinseactivaasncronamente,esposiblereparar
eldaoyseguir
Inconvenientes
Esdifcilrepararloserroresdetectadosporelentornodeejecucin
Ejemplo:desbordamientoaritmtico
puedehaberregistrosconresultadosparciales
elmanejadorpuedealterarlosregistros
Esdifcilderealizar
sepuedeejecutardenuevoelbloquedesdeelprincipio
STRL
2001JuanAntoniodelaPuente
26
Modelodeterminacin
4
R
raiser
17
Hr
7
STRL
2001JuanAntoniodelaPuente
27
Excepcionesysistemasoperativos
Elsistemaoperativosueledetectarsncronamentealgunoserrores(por
ejemplo,violacindememoria)
Enlossistemasoperativosconvencionalesseabortaelprocesoen
ejecucin
POSIXpermitequelaaplicacinmanejelasexcepciones(mediante
seales)
Cuandoelmanejadortermina,sereanudaelproceso
(modelodereanudacin)
Siellenguajesoportaelmodelodeterminacin(comoAda),
elncleodeejecucin(RTS)seencargadegestionarlo
STRL
2001JuanAntoniodelaPuente
28
ndice
Introduccin
Tratamientodeexcepciones
mtodosprimitivos
mtodosavanzados
TratamientodeexcepcionesenAda
TratamientodeexcepcionesenC++
TratamientodeexcepcionesenC
Excepcionesybloquesderecuperacin
STRL
2001JuanAntoniodelaPuente
29
ExcepcionesenAda
Lasexcepcionessedeclaranexplcitamente
Stuck_Valve : exception;
Caractersticas
STRL
mbito:secuenciaconmanejador(bloqueocuerpo)
propagacinsinohaymanejador
modelodeterminacin
parmetroseidentificadorasociados,medianteelpaquete
Ada.Exceptions
2001JuanAntoniodelaPuente
30
Ada.Exceptions
package Ada.Exceptions is
type Exception_Id is private;
Null_Id : constant Exception_Id;
function Exception_Name (X : Exception_Id) return String;
type Exception_Occurrence is limited private;
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 : Exception_Occurrence);
function Exception_Identity (X : Exception_Occurrence)
return Exception_Id;
function Exception_Name
(X : Exception_Occurrence) return
String;
function Exception_Information (X : Exception_Occurrence)return
String;
...
private
...
end Ada.Exceptions;
STRL
2001JuanAntoniodelaPuente
31
Ejemplo
package Valve is
...
Stuck_Valve : exception;
end Valve;
with Ada.Exceptions; use Ada.Exceptions;
with Valve; use Valve;
package Valve_Exceptions is
Stuck_Valve_Id : Exception_Id := Stuck_ValveIdentity;
-- Exception_Name(Stuck_Valve_Id) =
"Valve_Exceptions.Stuck_Valve"
end Valve_Exceptions;
STRL
2001JuanAntoniodelaPuente
32
Excepcionespredefinidas
Constraint_Error :seelevacuando
seintentaasignarunvalorfueradelintervalodeclarado
elndicedeunarrayestfueradelintervalo
seintentaaccederaunobjetoatravsdeunpunteronulo
seproduceunerrornumrico
Storage_Error :seelevacuando
seintentaasignarmemoriadinmicaynohaysuficiente
Program_Error
Tasking_Error
lasveremosmsadelante
Todasestasexcepcionesseelevanautomticamenteporelncleode
ejecucin
STRL
2001JuanAntoniodelaPuente
33
Elevacinexplcitadeunaexcepcin
Sepuedehacerconunainstruccin:
if Device_Error then
raise IO_Error;
end if;
TambinconunprocedimientodeAda.Exceptions
(perohacefaltaunidentificador)
Ada.Exceptions.Raise_Exception
(IO_ErrorIdentity, "Error in device);
STRL
Cadavezqueseelevaunaexcepcinseproduceuna
ocurrenciadelamisma
Elmanejadorpuedeaccederaunvalordetipo
Ada.Exceptions.Exception_Occurrence
2001JuanAntoniodelaPuente
34
Manejadoresdeexcepciones
Unmanejadoresunasecuenciadeinstrucciones
Seponenalfinaldelbloqueocuerpo
Ejemplo:
declare
Sensor_High, Sensor_Low, Sensor_Dead: exception;
...
begin
-- instrucciones donde se pueden elevar
excepciones
exception
when Sensor_High | Sensor_Low =>
-- secuencia de instrucciones
when E : Sensor_Dead =>
-- producir un sonido de alarma
-- E denota la ocurrencia de la excepcin
end;
STRL
2001JuanAntoniodelaPuente
35
Manejadorpordefecto
declare
Sensor_High, Sensor_Low, Sensor_Dead: exception;
use Ada.Text_IO;
begin
-- instrucciones donde se pueden elevar excepciones
exception
when Sensor_High | Sensor_Low =>
-- secuencia de instrucciones
when E : others =>
Put_Line (Exception_Name (E));
-- producir un sonido de alarma
end;
STRL
2001JuanAntoniodelaPuente
36
Propagacin
Sinohaymanejadorenelbloqueocuerpodondeseelevauna
excepcin,seterminasteysepropagaalnivelsuperior
(bloqueexterioropuntodeinvocacin)
Tambinsepropaganlasexcepcioneselevadasenlosmanejadores
Lasexcepcionesdelasecuenciainicialdeunpaquetesepropagana
latareadeentorno,quelasinvocaantesdellamaralprograma
principal
Siunaexcepcinsepropagafueradesumbitodevisibilidad,se
puedemanejarconunmanejadorpordefecto
Siquedaalgunaexcepcinsinmanejarenlatareadeentorno,el
programaaborta
STRL
2001JuanAntoniodelaPuente
37
Ejemplo(1)
package Temperature_Control is
subtype Temperature is Integer range 0 .. 100;
Sensor_Dead, Controller_Dead : exception;
procedure Set (Reference : Temperature);
function Current_Value return Temperature;
end Temperature_Control;
package body Temperature_Control is
procedure Set (Reference : Temperature)is
begin
-- poner referencia en controlador
if No_Response then
raise Controller_Dead;
end if;
end Set;
STRL
2001JuanAntoniodelaPuente
38
Ejemplo(2)
function Current_Value return Temperature is
begin
-- leer sensor
if No_Response then
raise Sensor_Dead;
end if;
-- calcular Value
return Value;
exception
when Constraint_Error =>
-- valor errneo, corregir
end Current_value;
begin -- package body Temperature_Control
Set (Initial_Value);
exception
when Controller_Dead =>
-- alarma
end Temperature_Control;
STRL
2001JuanAntoniodelaPuente
39
ProblemasdelasexcepcionesenAda
Paquetes
Lasexcepcionessedeclaranenlaespecificacinyseusanenelcuerpo
Noestclaroquexcepcionespuedeelevarcadasubprograma
Parmetrosdelasexcepciones
Slosepuedenpasartirasdecaracteres
mbitoypropagacin
Lasexcepcionessepuedenpropagararegionesdondenosonvisibles
STRL
2001JuanAntoniodelaPuente
40
ndice
Introduccin
Tratamientodeexcepciones
mtodosprimitivos
mtodosavanzados
TratamientodeexcepcionesenAda
TratamientodeexcepcionesenC++
TratamientodeexcepcionesenC
Excepcionesybloquesderecuperacin
STRL
2001JuanAntoniodelaPuente
41
ExcepcionesenC++
Lasexcepcionessonobjetosarbitrarios
Nohacefaltadeclararlasexplcitamente
Caractersticas
STRL
mbito:bloqueexplcito
propagacinsinohaymanejador
modelodeterminacin
nohayexcepcionespredefinidas
2001JuanAntoniodelaPuente
42
Ejemplo(1)
Primerosedeclaraunaclasedeexcepciones
class integer_constraint_error {
public:
int lower_limit;
int upper_limit;
int value;
integer_constraint_error (int L,int U, int V){
/* constructor */
lower_limit = L;
upper_limit = U;
value = V;
}
};
STRL
integer_constraint_erroresunaclasedeexcepcionescon
parmetros(lower_limit,upper_limit,value)
2001JuanAntoniodelaPuente
43
Ejemplo(2)
Clasetemperatura
class temperature {
int T;
public:
temperature(int initial=50)
throw(integer_constraint_error); /* constructor
*/
int operator=(int) throw
(integer_constraint_error);
};
Elconstructoryeloperador=puedenelevar(tirar)unobjetodetipo
integer_constraint_error paraindicarunaexcepcin
STRL
2001JuanAntoniodelaPuente
44
Ejemplo(3)
Clasecontrolador
class temperature_controller {
temperature T;
public:
class actuator_dead{};
void set (temperature)
throw(actuator_dead, integer_constraint_error);
temperature current_value();
temperature_controller (temperature); /* constructor
*/
};
actuator_deadesunaexcepcinsinparmetros
STRL
2001JuanAntoniodelaPuente
45
Listadeexcepciones
Cadafuncinsepuededeclarar
conunalistadeclasesdeexcepcionesquepuedetirar
conunalistavaca(lafuncinnotiraningunaexcepcin)
sinlistadeexcepciones(puedetirarcualquierexcepcin)
Silafuncinintentatirarunaexcepcinquenoestpermitida,
sellamaaunafuncinunexpected
(pordefectollamaaterminate,queabortaelprograma)
sepuedenredefinirambasfunciones
STRL
(PFV new_handler);
2001JuanAntoniodelaPuente
46
Ejemplo(4)
Lasexcepcionessetiranconthrow
class temperature {
int T;
public:
temperature(int initial=50)throw(integer_constraint_error){
check (initial);
};
int operator=(int i) throw (integer_constraint_error){
check(i); return T;
};
private:
void check (int value){
if (value > 100 || value < 0){
throw integer_constraint_error (0, 100, value);
} else{
T=value;
}
};
};
STRL
2001JuanAntoniodelaPuente
47
Ejemplo(5)
Lasexcepcionessemanejanconunbloquetrycatch
Losmanejadoresempiezanconcatch
try {
temperature_controller TC (20);
/* instrucciones */
}
catch (integer_constraint_error){
cout << "error in constrained integer type\n";
}
catch (temperature_controller::actuator_dead) {
cout << "temperature actuator not responding\n";
}
catch (...) {
/* manejador por defecto */
cout << "unknown error - propagate";
throw;
/* volver a tirar la misma excepcin */
}
STRL
2001JuanAntoniodelaPuente
48
Manejadores
UnmanejadordetipoT,constT,T&constT&
atrapaunobjetodetipoEsi
TyEsonelmismotipo
TesuntipopunteroyEesotrotipopunteroquesepuedeconvertir
aTenelpuntodondesetiraelobjeto
TesuntipopunteroyelobjetoesdeltipoalqueapuntaT
TesunaclasebasedeEenelpuntodondesetiraelobjeto
Estaltimareglapermitedefinirjerarquasdeexcepciones
STRL
2001JuanAntoniodelaPuente
49
Ejemplo(6)
class exception {
virtual void message () {cout << "exception thrown\n";}
};
class integer_constraint_error : public exception {
int lower_limit;
int upper_limit;
int value;
public:
integer_constraint_error (int L,int U, int V){
lower_limit = L;
upper_limit = U;
value = V;
};
virtual void message () {
cout << "constraint error\n";
};
};
class actuator_dead : public exception {...};
STRL
2001JuanAntoniodelaPuente
50
Ejemplo(7)
Estemanejadoratrapalasexcepcionesdetipoexception,
integer_constraint_erroryactuator_dead
try {
/* instrucciones */
}
catch (exception E) {
/* manejador para el tipo excepcin y todos sus derivados */
E::message(); /* escribe el mensaje segn el tipo de E */
}
STRL
2001JuanAntoniodelaPuente
51
ndice
Introduccin
Tratamientodeexcepciones
mtodosprimitivos
mtodosavanzados
TratamientodeexcepcionesenAda
TratamientodeexcepcionesenC++
TratamientodeexcepcionesenC
Excepcionesybloquesderecuperacin
STRL
2001JuanAntoniodelaPuente
52
ExcepcionesenC
EnCnohayningnmecanismodeexcepciones
Sepuedeconstruiralgoparecido(perolimitado)
Paraimplementarelmodelodeterminacinhayque
guardaryrestaurarelestadodeentradaaldominiode
unaexcepcin
sepuedehacerconsetjmpylongjmp(POSIX)
STRL
2001JuanAntoniodelaPuente
53
Esquema
typedef char *exception;
exception error="error";
/* comienzo del mbito de la excepcin */
if (current_exception = (exception)setjmp(save_area) == 0)
{
/* instrucciones donde se pueden producir excepciones
*/
if (error_detected) {
longjmp(save_area, (int)error);
};
}
else {
if (current_exception == error) {
/* manejador de error */
} else {
/* propagar la excepcin */
}
}
/* final del mbito de la excepcin */
STRL
2001JuanAntoniodelaPuente
54
Macros
#define NEW_EXCEPTION (name) ...
/* declaracin de excepcin */
#define BEGIN ...
/* comienzo de mbito */
#define EXCEPTION ...
/* comienzo de lista de manejadores */
#define END ...
/* fin de mbito */
#define RAISE (name) ...
/* elevar excepcin */
#define WHEN (name) ...
/* manejador */
#define OTHERS ...
/* manejador por defecto */
STRL
2001JuanAntoniodelaPuente
55
Ejemplo
NEW_EXCEPTION (sensor_high);
NEW_EXCEPTION (sensor_low);
NEW_EXCEPTION (sensor_dead);
...
BEGIN
...
RAISE (sensor_high);
...
EXCEPTION
WHEN (sensor_high)
/* manejador */
...
END;
STRL
2001JuanAntoniodelaPuente
56
ndice
Introduccin
Tratamientodeexcepciones
mtodosprimitivos
mtodosavanzados
TratamientodeexcepcionesenAda
TratamientodeexcepcionesenC++
TratamientodeexcepcionesenC
Excepcionesybloquesderecuperacin
STRL
2001JuanAntoniodelaPuente
57
Excepcionesybloquesderecuperacin
Partimosdelesquema
ensure <condicin de aceptacin>
by
<mdulo primario>
else by
<mdulo alternativo>
else by
<mdulo alternativo>
...
else by
<mdulo alternativo>
else error;
ladeteccindeerroressehaceenlapruebadeaceptacin
necesitamosguardaryrecuperarelestadoenelpuntoderecuperacin
STRL
2001JuanAntoniodelaPuente
58
Recuperacindelestado
Suponemosunpaquetedebiblioteca
package Recovery_Cache is
procedure Save;
procedure Restore;
end Recovery_Cache;
Hacefaltasoportedelncleodeejecucin
Puedenosermuyeficiente
nosetienenencuentalascaractersticasdelaaplicacin
STRL
2001JuanAntoniodelaPuente
59
Esquema(1)
procedure Recovery_Block is
Primary_Failure, Secondary_Failure, Tertiary_Failure :
exception;
Recovery_Block_Failure : exception;
type Module is (Primary, Secondary, Tertiary);
function Acceptance_Test return Boolean is
begin
-- condicin de aceptacin
end Acceptance_Test;
STRL
2001JuanAntoniodelaPuente
60
Esquema(2)
procedure Primary is
begin
-- cdigo del mdulo primario
if not Acceptance_Test then
raise Primary_Failure;
end if;
exception
when Primary_Failure =>
-- recuperacin directa del sistema controlado
raise;
when others =>
-- recuperacin directa del sistema controlado
raise Primary_Failure;
end Primary;
...
STRL
2001JuanAntoniodelaPuente
61
Esquema(3)
begin -- Recovery_Block
Recovery_Cache.Save;
for Try in Module loop
begin
case Try is
when Primary
=> Primary;
exit;
when Secondary => Secondary; exit;
when Tertiary => Tertiary;
end case;
exception
when Primary_Failure
=> Recovery_Cache.Restore;
when Secondary_Failure => Recovery_Cache.Restore;
when Tertiary_Failure => Recovery_Cache.Restore;
raise
Recovery_Block_Failure;
when others
=> Recovery_Cache.Restore;
raise
Recovery_Block_Failure;
end;
end loop;
end Recovery_Block
STRL
2001JuanAntoniodelaPuente
62
Resumen
Lasexcepcionessonunmecanismoderecuperacindirectadefallos
Perosepuedenusar(conayudadelentornodeejecucin)para
realizarbloquesderecuperacin
Losaspectosimportantesson:
representacinexplcitaenellenguaje
mbitodelosmanejadores
propagacindeexcepciones
terminacinoreanudacin
parmetrosasociados
Ada,C++yotroslenguajessoportanexcepcionesdeformamuy
completa
Otroslenguajes(comoC)nolohacen
STRL
2001JuanAntoniodelaPuente
63