Está en la página 1de 24

Aspectos de los Lenguajes de

Programación

Gestión de
Excepciones

Mg. Ing. Zulema Beatriz ROSANIGO


Qué es una excepción?
 Es algo que se aparta de la regla general.
 Una excepción es un evento anormal que ocurre en
tiempo de ejecución de un sistema y que puede ocasionar
que una operación falle.

Intentos de Entradas erróneas de


división por cero datos

Índices de arreglos fuera


de rango

Opera
r os n o cio
pa r á met para e nes no váli
Valores de l problema l tipo d
de d at a s
acordes a o
Cómo actuar ante una posible
situación excepcional?

Ignorarla Tomar
c i ó n precauciones
r m ina a
T e b r up t Conozco cuales son las
a precondiciones de una
operación y verifico
previamente cumplirlas
Ejecutar y antes de utilizarlas
comprobar
Comprobación mediante Meca
parámetros de error, propiedades espe nismos
del objeto, valores de retorno (a ciale
gesti s de
cargo del programador) o mediante
variables globales definidas por el exce ón de
pcion
LP para manejo de errores es
Lo más
conveniente ?
Gestión de excepciones: Objetivos
 Tratar de recuperarse de los errores
– Datos erróneos: volver a preguntar.
– Archivo no encontrado: preguntar por su ubicación.
– Invocar la excepción para ser manejada por la autoridad superior.
 Provocar una salida ordenada si no es posible
recuperarse
– Salida ordenada: liberando recursos, memoria, …
– Termina, pero primero imprime una ayuda en el mensaje de error.
 Código más limpio
– Tratamiento de errores separado de la lógica de la aplicación.
Gestión de excepciones
Ocurre una
falla

Disparo de
excepción

no Existe si
manejador? ¿Dónde continúa?

Error en tiempo Ejecución del


de ejecución manejador

Terminación
abrupta
Modos de manejo
P0 P1 P2
Call P1 Call P2 Se produce la
... Raise E1
... ... excepción
....
Manejador de E1
Reasunción

 Reasunción: Se maneja la excepción y se devuelve el control al punto siguiente


dónde se invocó a la excepción, permitiendo la continuación de la ejecución de la
unidad.

P0 P1 P2
Call P1 Call P2 ... Raise E1 Se produce la
... ... .... excepción
Manejador de E1
Terminación

 Terminación: Se termina la ejecución de la unidad que alcanza la excepción


y se transfiere el control al manejador.
Gestión de excepciones
 Disparo de la excepción
(Lanzamiento o implantación)
– Provocada por una operación primitiva definida por el LP.
Ejemplo:
 La operación dividir, al intentar dividir por cero.
– Explícitamente por el programador mediante un enunciado
provisto para ese fin.
Ejemplo:
if mes < 0 or mes > 12 then
raise MesIncorrecto;
end if;

if (mes < 0 || mes > 12)


throw new MesIncorrecto();
Gestión de excepciones
 Manejador de excepciones
– Es el conjunto de declaraciones de variables locales y serie de
enunciados ejecutables definidos para tratar una excepción.
– Para suministrar la conexión entre una excepción y su manejador,
a cada clase de excepciones se le da un nombre.
– Cada manejador de excepciones se aparea con el nombre o
nombres de las excepciones que va a manejar.
 Propagación de una excepción
– Cuando una excepción se maneja en un subprograma distinto del
subprograma en que se planteó, se dice que la excepción se ha
propagado desde el punto donde se planteó hasta el punto donde
se maneja.
Gestión de excepciones en Java
 El bloque tolerante a fallas, llamado bloque try, tiene esta forma:
try {
// sentencias sobre las se quiere controlar las excepciones
}
catch (Except1 e) { ...
// manejador correspondiente al tipo Except1
// e es el objeto Except1 con toda la info asociada
}
catch (Except2 e) { ...
// manejador correspondiente al tipo Except2
// e es el objeto Except2 con toda la info asociada
}
finally { ...
// bloque final: se ejecuta siempre, haya habido o no excepción.
}
 El bloque try requiere al menos un bloque catch o un bloque finally.
Gestión de excepciones en Java
 Las excepciones son objetos. Hay dos tipos:
– Verificadas: Lanzadas explícitamente
– No verificadas: Errores en tiempo de ejecución
Object
 Un método sólo puede lanzar explícitamente
excepciones declaradas. Throwable
public void cambiarValor (String clave, Object valor)
throws ClaveNoExiste
{ Exception Error
if (obtener(clave)==null)
throw new ClaveNoExiste ();

RunTimeException
}; Otras excepciones
 Definición de la clase ClaveNoExiste
public class ClaveNoExiste extends Exception {..};
Ejemplo en java
public int loadConfigData() throws ConfigFileException {
try {
FileInputStream fis = new
FileInputStream(“C:\\config.txt”);
BufferedReader br = new BufferedReader(new
InputStreamReader(fis));
String numStr = br.readLine();
return Integer.parseInt(numStr);
}catch (FileNotFoundException e) {
throw new ConfigFileException(“Falta el archivo”,e);
}catch (Exception e) {
if (Debug.isActive()) e.printStackTrace();
throw new ConfigFileException(“Error en config file”,e);
}
}
Cuestiones de diseño
 Excepciones:
– ¿Cuáles son las excepciones predefinidas del lenguaje? ¿Pueden
desactivarse?
– ¿Se pueden definir nuevas excepciones? ¿Cómo? ¿Cuál es su alcance?
– ¿Pueden tener información asociada?
– ¿Cómo se alcanza o lanza una excepción?
 Manejador de excepciones:
– ¿Cómo se define? ¿Cuál es su alcance?
– ¿Cómo se liga la excepción con el manejador?
– ¿Cuáles son los manejadores de excepciones suministrados para
excepciones predefinidas? ¿Pueden ser reemplazados?
 Control:
– ¿Cómo se pasa el control al manejador?
– ¿A dónde se cede el control cuando se termina de atender la excepción?
– ¿Qué entorno de ejecución queda después que se haya ejecutado el
manejador?
Gestión de excepciones en PL/I
 Primer LP en proporcionar soporte para manejo de excepciones.
– Define un número de excepciones incorporadas y proporciona
manejadores definidos por el sistema para ellas, los cuales pueden ser
redefinidos.
 Las excepciones definidas por el usuario se declaran:
CONDITION nombre_excepción
 Los manejadores se declaran con la sentencia ON
ON nombre_excepción manejador_excepciones
 No permite que se pasen parámetros a los manejadores.
 Se lanza explícitamente una excepción con la sentencia SIGNAL
SIGNAL nombre_excepción
 Se puede habilitar, deshabilitar y redefinir manejadores.
(SUBSCRIPRANGE, NOOVERFLOW):
BEGIN Se habilita SUBSCRIPRANGE y se
... deshabilita OVERFLOW en el
END conjunto de sentencias del bloque
Gestión de excepciones en PL/I
 Utiliza el criterio de Reasunción.
– Cuando se produce la excepción, la maneja el manejador y
devuelve el control a la sentencia siguiente de dónde se levantó.
 Los manejadores se ligan dinámicamente con las
excepciones. Una excepción siempre estará ligada con el
último manejador definido.
 El alcance de un manejador de una excepción
– termina cuando finaliza la ejecución de la unidad donde fue
declarado.
– se acota cuando se define otro manejador para esa excepción y
– se restaura cuando se desactivan los manejadores que la
enmascararon.
Gestión de excepciones en CLU
 Asocia un manejador a un procedimiento completo.
 Las excepciones que puede alcanzar un procedimiento deben
declararse en la cabecera.
factorial = proc (n: int) returns (int)
signals (negative, overflow)
 Se lanza explícitamente una excepción con la sentencia SIGNAL
SIGNAL nombre_excepción
 El manejador se relaciona con la sentencia (simples o compuestas)
por medio de la cláusula except
<sentencia> except <lista de manejadores> end
 Una lista de manejadores tiene el siguiente formato:
when <lista de excepción 1>: <sentencia 1>
....
when <lista de excepción n>: <sentencia n>
 No permite inhabilitar excepciones.
Gestión de excepciones en CLU
 Tiene excepciones ya predefinidas con su manejador asociado.
 Utiliza el criterio de Terminación.
 No permite que una unidad maneje por sí misma la excepción que ha
lanzado. Al producirse una excepción:
– Se termina el procedimiento donde se levantó la excepción y devuelve el
control al llamante inmediato para ubicar el manejador.
– Si el manejador se encuentra en ese ámbito, se ejecuta y luego se pasa
el control a la sentencia siguiente a la que está ligado dicho manejador.
– En caso de no encontrar ningún manejador en el procedimiento que hizo
la llamada se levanta una excepción faliure y devuelve el control.
 Se pueden pasar parámetros a los manejadores.
 Una excepción se puede volver a levantar utilizando resignal
Gestión de excepciones en ADA
 Asocia un manejador al cuerpo de un subprograma, de un paquete,
de una tarea o de un bloque.
 La excepciones se definen en la zona de definición de las variables,
colocando la palabra exception.
Ejemplo: AYUDA: exception;
 Se alcanza explícitamente una excepción con la sentencia raise
raise AYUDA
 El manejador se encuentra al final del bloque y se relaciona con las
sentencias por medio de la palabra reservada exception.
begin ...
exception
when AYUDA => ... // manejador para AYUDA
when DESEAPERADO =>... // manejador para DESESPERADO
end
Gestión de excepciones en ADA
 Utiliza el criterio de Terminación.
– Cada vez que se produce una excepción, se termina el bloque,
paquete, procedimiento, o tarea dónde se levantó y se ejecuta el
manejador asociado.
 Tiene cuatro excepciones ya predefinidas con su
manejador asociado: Constraint-error, Program-
error, Storage-error y Tasking-error.
 El ámbito de una excepción es igual que el de las
variables.
Gestión de excepciones en ADA
 Mecanismo de manejo de excepciones multinivel.
– una excepción alcanzada en una unidad puede ser manejada por
otras unidades de su llamador inmediato.
 Al producirse una excepción:
– Se termina la unidad, bloque, etc. dónde se alcanza la unidad.
– Si el manejador se encuentra en ese ámbito, se ejecuta.
– Si el manejador no se encuentra en ese lugar la excepción se
propaga dinámicamente => se vuelve a levantar en otro ámbito.
– Una excepción se pude levantar nuevamente colocando sólo la
palabra raise. Se vuelve a levantar la última excepción
levantada.
Ejemplo en Ada
procedure Tope(X: out tElemento; P: in tPila) is
begin
if (P.pila = null) then
raise Pila_Vacia; Pila_Vacia: excepción;
else
X := P.pila.all.Elemento;
end if;
end Tope;

....
Tope(dato,P);
....
exception
when Pila_Vacia =>
Text_IO.Put_Line ("Error !!!. La Pila esta Vacia ");
when others =>
Text_IO.Put_Line (“Otros errores!!!");
end;
Gestión de excepciones en C++
 Asocia un manejador a un bloque específico, no
necesariamente el cuerpo completo de la operación.
– A ese bloque, se le pueden asociar distintos manejadores de
acuerdo a las distintas excepciones que se pueden generar.
 Utiliza el criterio de Terminación.
 Mecanismo de manejo de excepciones multinivel.
 Permite disparar excepciones definidas por el
programador con la sentencia throw
throw except1;
 Las excepciones no requieren una declaración especial.
Pueden ser de cualquier tipo de dato (no necesariamente
objetos) y pueden tener información asociada.
Gestión de excepciones en C++
 El manejador se relaciona con las sentencias por medio
de los bloques try-catch
try {
... // sentencias sobre las se quiere controlar las excepciones
}
catch(Except1 e) {...} // manejador correspondiente a Except1
catch(Help msg) {
// manejador correspondiente a un tipo enumerado Help
switch (msg){
case MSG1: ... // atención de este tipo de excepción
...
case MSGn: ... // atención de este tipo de excepción
}
}
Gestión de excepciones en Java
 Muy similar a C++
– Asocia un manejador a un bloque específico, no necesariamente
el cuerpo completo de la operación.
– A ese bloque, se le pueden asociar distintos manejadores de
acuerdo a las distintas excepciones que se pueden generar.
– Utiliza el criterio de Terminación.
– Mecanismo de manejo de excepciones multinivel.
– Permite disparar excepciones definidas por el programador con la
sentencia throw
– El manejador se relaciona con las sentencias por medio de los
bloques try-catch
Gestión de excepciones en Java
 Diferencias con C++
– Las excepciones siempre son objetos y se organizan
jerárquicamente.
– Todas las excepciones que pueden ser lanzadas explícitamente
deben ser listadas en la cabecera de la rutina con la palabra
reservada throws
void foo() throws Help;
// foo no tiene manejador para la excepción Help
– Los clientes de estas rutinas deben poder reaccionar
apropiadamente:
 Capturando la excepción y atendiéndola (bloque try-catch)
 Propagando la excepción: declarando en su cabecera las excepciones
no atendidas con la cláusula throws.
– El manejador siempre recibe como parámetro el objeto de la clase
de Excepción ocurrida. Este objeto tiene toda la información
asociada.

También podría gustarte