Está en la página 1de 63

dit

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

Sepuedeusarothers alfinaldelalistademanejadores para


denotarcualquierexcepcinsinnombrarlaexpresamente
Ejemplo:

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

typedef void (*PFV)();


PFV set_unexpected (PFV new_handler);
PFV set_terminate

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

También podría gustarte