Publicado el 15 de Octubre del 2018
584 visualizaciones desde el 15 de Octubre del 2018
509,3 KB
63 paginas
Creado hace 18a (06/03/2007)
ditdit
UPM
Excepciones
Juan Antonio de la Puente
DIT/UPM
Transparencias basadas en el capítulo 6 del libro de A. Burns y A. Wellings RealTime Systems and Programming Languuages, 3ª edición (2001)
Objetivos
u Veremos algunos modelos de tratamiento de excepciones
en lenguajes de programación
u También veremos cómo utilizar las excepciones para
realizar sistemas que toleran fallos
STRL
©2001 Juan Antonio de la Puente
2
Índice
u Tratamiento de excepciones
– métodos primitivos
– métodos avanzados
u Tratamiento de excepciones en Ada
u Tratamiento de excepciones en Java
u Tratamiento de excepciones en C
u Excepciones y bloques de recuperación
STRL
©2001 Juan Antonio de la Puente
3
Introducción
Un mecanismo de excepciones debe cumplir una serie de
requisitos
– ser fácil de entender y de usar
– separación de código normal y código de tratamiento de
excepciones
– eficiencia (sólo debe haber sobrecoste cuando se trata la
excepción)
– tratamiento uniforme de excepciones detectadas por el entorno de
ejecución y por el software de aplicación
– acciones de recuperación programables (no sólo predefinidas)
STRL
©2001 Juan Antonio de la Puente
4
Excepciones en lenguajes primitivos (1)
u Código de error en el resultado de un subprograma
– Ejemplo: C
if ( function_call (params) != 0){
-- tratamiento de errores
} else {
-- actividad normal
};
– Inconvenientes:
» el código no está separado de la actividad normal
» hay sobrecoste cuando no hay errores
» no se pueden tratar fácilmente los errores del entorno
STRL
©2001 Juan Antonio de la Puente
5
Excepciones en lenguajes primitivos (2)
u Retorno condicional
– Se usa en lenguaje ensamblador
call ROUTINE
jmp ERROR_1
jmp ERROR_2
; tratamiento normal
– Inconvenientes:
» difícil de usar y entender
» poca abstracción
» difícil de integrar con la detección de errores por el entorno
STRL
©2001 Juan Antonio de la Puente
6
Excepciones en lenguajes primitivos (3)
u Salto incondicional global
– Algunos lenguajes permiten saltar a otra parte del programa, fuera
del módulo donde se realiza el salto
– Hay que combinarlo con un retorno de subprograma anormal
» difícil de usar y entender
» poco abstracto
STRL
©2001 Juan Antonio de la Puente
7
Ejemplo (RTL/2)
svc data rrerr
label erl; %a label variable %
enddata
proc WhereErrorIsDetected();
...
goto erl;
...
endproc;
proc Caller();
...
endproc;
WhereErrorIsDetected();
...
proc main();
...
restart:
...
erl := restart;
...
Caller();
...
end proc;
STRL
©2001 Juan Antonio de la Puente
8
Excepciones en lenguajes primitivos (4)
u Variable de procedimiento
– El manejador se pasa como un procedimiento variable
» muy difícil de usar y de mantener
» en C++ se usa una variante de este método para el tratamiento de
excepciones cuando no hay manejador (funciones por defecto)
STRL
©2001 Juan Antonio de la Puente
9
Ejemplo (RTL/2)
proc main();
...
erl := fail;
erp := recover;
...
Caller();
...
fail:
...
end proc
svc data rrerr;
proc(int) erp; % erp is a
label erl;
procedure variable %
enddata;
proc recover(int);
...
endproc;
proc WhereErrorIsDetected();
...
if recoverable then erp(n)
else goto erl end;
...
endproc;
proc Caller();
...
WhereErrorIsDetected();
...
endproc;
STRL
©2001 Juan Antonio de la Puente
10
Excepciones en lenguajes de modernos
u Son elementos de lenguaje que permiten integrar los dos
tipos de detección de errores
– detección por el entorno de ejecución
– detección por el software de aplicación
u Las excepciones pueden ser
– síncronas
» aparecen inmediatamente cuando un proceso intenta ejecutar una
operación incorrecta
– asíncronas
» aparecen algún tiempo después, en el proceso que intentó la
operación errónea o en otro distinto
STRL
©2001 Juan Antonio de la Puente
11
Clases de excepciones
u Detectadas por el entorno, síncronas
– ejemplos: error en índice de array, división por cero
u Detectadas por la aplicación, síncronas
– ejemplo: error en comprobación de aserción
u Detectadas por el entorno, asíncronas
– ejemplo: avería en dispositivo externo
u Detectadas por la aplicación, asíncronas
– ejemplo: detección de límite de tiempo en una acción de otro
proceso
Las excepciones asíncronas se suelen llamar señales
– Las veremos más adelante
STRL
©2001 Juan Antonio de la Puente
12
Excepciones síncronas
u Las excepciones se pueden declarar de varias formas
– con un nombre específico, de forma similar a una constante
» en este caso hace falta una declaración explícita de todas las
excepciones
» ejemplo: Ada
– como objetos de un tipo o clase
» no siempre hace falta declaración explícita
» ejemplo: Java
STRL
©2001 Juan Antonio de la Puente
13
Excepciones en Ada
u En Ada se declaran con un nombre (no son objetos)
package Standard is
...
Constraint_Error : exception;
Program_Error : exception;
Storage_Error : exception;
Tasking_Error : exception;
...
end Standard;
u Estas excepciones están predefinidas
u Las indica el núcleo de ejecución
STRL
©2001 Juan Antonio de la Puente
14
Excepciones en Java
u Las excepciones son objetos de una clase (Throwable)
– No hace falta declarar los objetos explícitamente
– El código de aplicación o el entorno de ejecución puede tirar
(throw) una excepción
– El manejador atrapa (catch) la excepción
Debe hacer referencia a la clase o a una superclase
STRL
©2001 Juan Antonio de la Puente
15
Ámbito de un manejador
u Una misma excepción puede tener varios manejadores en
un programa
u Cada manejador tiene asociado un ámbito
u Se trata de una región donde, si se produce la excepción,
se ejecuta el manejador asociado
u En los lenguajes estructurados en bloques, el ámbito de
un manejador suele ser el bloque donde está declarado
u También puede ser un subprograma
STRL
©2001 Juan Antonio de la Puente
16
Ámbito de los manejadores en Ada
u Los manejadores se declaran al final de un bloque, que
constituye el ámbito de los mismos
declare
subtype Temperature is Integer range 0 .. 100;
begin
-- leer sensor y calcular un valor de temperatura
exception
-- manejador de Constraint_Error
end;
u Los procedimientos, funciones, y otras secuencias de
instrucciones, pueden también definir ámbitos de
excepciones
STRL
©2001 Juan Antonio de la Puente
17
Ámbito de los manejadores en Java
u No todos los bloques pueden tener manejadores
u El ámbito de un manejador se indica explícitamente
mediante un bloque guardado (tryblock)
try {
// instrucciones normales
}
catch (excepcion_type E) {
// manejador de excepción
}
STRL
©2001 Juan Antonio de la Puente
18
Resolución del dominio
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;
u El manejador no puede saber dónde se elevó la excepción
STRL
©2001 Juan Antonio de la Puente
19
Bloques anidados
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;
u Es largo y pesado
STRL
©2001 Juan Antonio de la Puente
20
Manejadores asociados a instrucciones
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;
u Más compacto, pero código normal y manejadores
mezclados
– Ejemplo: CHILL
STRL
©2001 Juan Antonio de la Puente
21
Excepciones con parámetros
u Si se asocia un parámetro a la excepción que indique el
punto donde se ha elevado, el manejador puede usar esta
información
– Ada : procedimientos predefinidos que permiten asociar un
mensaje a una excepción
– Java : se puede incluir la información en la definición de la clase de
excepciones
STRL
©2001 Juan Antonio de la Puente
22
Propagación de excepciones
u Cuando no hay manejador en un bloque se pueden
hacer varias cosas:
– considerarlo un error de programación
» muy restrictivo
» problemas con procedimientos
– propagar la excepción al punto de invocación
» se busca un manejador en el contexto del punto donde se
activó el bloque en que se ha producido la excepción
» Una excepción se puede propagar fuera de su ámbito de
visibilidad
» solución: manejadores por defecto para excepciones
desconocidas
» si en un proceso o en el programa principal queda sin manejar
una excepción, aborta
STRL
©2001 Juan Antonio de la Puente
23
Reanudación y terminación
u Cuando el manejador termina se pueden hacer dos cosas:
– reanudar la ejecución del bloque
– terminar la ejecución del bloque y devolver el control al punto de
invocación
u También hay modelos híbridos
STRL
©2001 Juan Antonio de la Puente
24
Modelo de reanudación
P
1
13
2
12
Q
3
11
7
H r
4
6
8
R
5
raise r
9
10
STRL
©2001 Juan Antonio de la Puente
25
Crítica del modelo de reanudación
u Ventajas
– Cuando la excepción se activa asíncronamente, es posible reparar
el daño y seguir
u Inconvenientes
– Es difícil reparar los errores detectados por el entorno de ejecución
» Ejemplo: desbordamiento aritmético
u puede haber registros con resultados parciale
Comentarios de: Excepciones (0)
No hay comentarios