Publicado el 14 de Enero del 2017
1.105 visualizaciones desde el 14 de Enero del 2017
245,0 KB
15 paginas
Creado hace 15a (29/03/2010)
1
Prácticas de Programación
Tema 1. Introducción al análisis y diseño de programas
Tema 2. Clases y objetos
Tema 3. Herencia y Polimorfismo
Tema 4. Tratamiento de errores
Tema 5. Aspectos avanzados de los tipos de datos
Tema 6. Modularidad y abstracción: aspectos avanzados
Tema 7. Entrada/salida con ficheros
Tema 8. Verificación y prueba de programas
Prácticas de Programación
Tema 4. Tratamiento de errores
© M. Aldea y M. González
29/03/10
Tema 4. Tratamiento de errores
4.1. Tratamiento de errores por paso de parámetros
4.2. Excepciones
4.3. Bloques de tratamiento excepciones
4.4. Jerarquía de las excepciones
4.5. Lanzar excepciones
4.6. Usar nuestras propias excepciones
4.7. La cláusula finally
4.8. Utilización de excepciones
4.9. Bibliografía
Prácticas de Programación
Tema 4. Tratamiento de errores
parámetros
© M. Aldea y M. González
29/03/10
2
4.1 Tratamiento de errores por paso de
4.1 Tratamiento de errores por paso de parámetros
En los lenguajes de programación más antiguos (C, Fortran, ...)
• Cada método o función retorna un valor
- generalmente un código numérico o un booleano indicando
si había habido error o no, y cuál
Dos inconvenientes:
• el código de chequeo de error aparece por todas partes,
mezclado con el código normal
• en muchos casos el chequeo de error se omite por “pereza” o
desconocimiento
- lleva a situaciones de error que pasan inadvertidas
Prácticas de Programación
© M. Aldea y M. González
29/03/10
3
Tema 4. Tratamiento de errores
4.1 Tratamiento de errores por paso de parámetros
Ejemplo
El método añadeAlumno de una supuesta clase Curso sería:
/** añade un alumno. Retorna false si no se ha
* podido añadir */
public boolean añadeAlumno(Alumno a) {...}
Un fragmento de código que añade dos alumnos sería:
if (!añadeAlumno(a1)) {
error.escribe("Error añadiendo alumno");
return;
}
...
if (!añadeAlumno(a2)) {
error.escribe("Error añadiendo alumno");
return;
}
...
• el tratamiento de los errores hace difícil entender el código
Prácticas de Programación
Tema 4. Tratamiento de errores
© M. Aldea y M. González
29/03/10
4
4.2 Excepciones
4.2 Excepciones
Son un mecanismo especial para gestionar errores
• Permiten separar claramente el tratamiento de errores del
código normal
• Evitan que haya errores que pasen inadvertidos
• Permiten propagar de forma automática los errores desde los
métodos más internos a los más externos
• Permiten agrupar en un lugar común el tratamiento de errores
que ocurren en varios lugares del programa
Las excepciones se pueden elevar (o lanzar):
• automáticamente, cuando el sistema detecta un error
• explícitamente cuando el programador lo establezca
Presentes en lenguajes “modernos” (Java, Ada, C++,...)
Prácticas de Programación
Tema 4. Tratamiento de errores
© M. Aldea y M. González
29/03/10
5
4.2 Excepciones
Ejemplo de elevación automática:
División por cero
import fundamentos.*;
public class DivisionPorCero {
public static void main(String[] args) {
int i, j;
Lectura leer=new Lectura("Enteros");
leer.creaEntrada("i",0);
leer.creaEntrada("j",0);
leer.espera("introduce datos");
i=leer.leeInt("i");
j=leer.leeInt("j");
System.out.println("i/j="+i/j);
System.out.println("Fin");
} // fin main
} // fin DivisionPorCero
cuando j vale 0 se eleva
la excepción
ArithmeticException
cuando se eleva la excepción
esta línea no se ejecuta
Prácticas de Programación
© M. Aldea y M. González
29/03/10
6
Tema 4. Tratamiento de errores
Propagación de excepciones
1. Una línea de código genera o lanza (throw) una excepción
2. El bloque que contiene esa línea de código se aborta en ese
4.2 Excepciones
punto
3. Si el bloque tiene un manejador para esa excepción, el
manejador se ejecuta
• diremos que el bloque ha cogido (catch) la excepción
• la “vida” de la excepción finaliza en este punto
4. Si no tiene manejador, la excepción se propaga al bloque
superior
• que, a su vez, podrá cazar o dejar pasar la excepción
5. Si la excepción alcanza el bloque principal (main) y éste
tampoco coge la excepción, el programa finaliza con un
mensaje de error
Prácticas de Programación
Tema 4. Tratamiento de errores
© M. Aldea y M. González
29/03/10
7
}
}
}
Ejemplo: propagación de excepciones
private static int divide(int a, int b) {
System.out.println("divide: antes de dividir");
int div = a/b;
System.out.println("divide: después de dividir");
return div;
4.2 Excepciones
private static void intermedio() {
System.out.println("intermedio: antes de divide");
int div = divide(2,0);
System.out.println("intermedio: resultado:"+div);
public static void main(String[] args) {
System.out.println("main: antes de intermedio");
intermedio();
System.out.println("main: después de intermedio");
Prácticas de Programación
Tema 4. Tratamiento de errores
© M. Aldea y M. González
29/03/10
8
4.2 Excepciones
Ejemplo: propagación de excepciones (cont.)
La salida generada será:
main: antes de intermedio
intermedio: antes de divide
divide: antes de dividir
java.lang.ArithmeticException: / by zero
at Propaga.divide(Propaga.java:13)
at Propaga.intermedio(Propaga.java:20)
at Propaga.main(Propaga.java:26)
Prácticas de Programación
© M. Aldea y M. González
29/03/10
9
Tema 4. Tratamiento de errores
4.3 Bloques de tratamiento excepciones
La forma general de escribir un bloque en el que se tratan
excepciones es:
4.3 Bloques de tratamiento excepciones
try {
instrucciones;
} catch (ClaseExcepción1 e) {
instrucciones de tratamiento;
} catch (ClaseExcepción2 e) {
instrucciones de tratamiento;
}
Los “catch” se evalúan por orden:
• una excepción se coge en el primer “catch” para esa
excepción o para una de sus superclases
© M. Aldea y M. González
29/03/10
10
Prácticas de Programación
Tema 4. Tratamiento de errores
Ejemplo: propagación con bloque try-catch
En el ejemplo “propagación de excepciones” anterior, añadimos
un bloque try-catch al método intermedio:
4.3 Bloques de tratamiento excepciones
private static void intermedio() {
try {
System.out.println("intermedio: antes de " +
"divide");
int div=divide(2,0);
System.out.println("intermedio: resultado:" +
div);
} catch (ArithmeticException e) {
System.out.println("intermedio: cazada " + e);
}
}
Prácticas de Programación
Tema 4. Tratamiento de errores
© M. Aldea y M. González
29/03/10
11
4.3 Bloques de tratamiento excepciones
Ejemplo: propagación con bloque try-catch (cont.)
La salida por consola que obtenemos ahora es:
main: antes de intermedio
intermedio: antes de divide
divide: antes de dividir
intermedio: cazada ArithmeticException: / by zero
main: después de intermedio
• en este caso la excepción es cazada, por lo que
- el programa NO finaliza de forma abrupta
- NO aparece un mensaje del sistema indicando que se ha
producido una excepción
Prácticas de Programación
© M. Aldea y M. González
29/03/10
12
Tema 4. Tratamiento de errores
4.3 Bloques de tratamiento excepciones
Tratamiento específico
En el ejemplo anterior, el manejador realiza únicamente el
tratamiento de la excepción ArithmeticException
try {
...;
} catch (ArithmeticException e) {
...;
}
Es posible poner un tratamiento común para cualquier excepción
try {
...;
} catch (Exception e) {
...;
}
• es cómodo pero no es recomendable, ya que puede ocurrir un
tratamiento inadecuado para una excepción no prevista
Prácticas de Programación
Tema 4. Tratamiento de errores
© M. Aldea y M. González
29/03/10
13
4.4 Jerarquía de las excepciones
4.4 Jerarquía de las excepciones
Throwable
se pueden
tratar
no es
obligatorio
tratarlas
Exception
Error
no se tratan
RuntimeException
ExceptionUsuario
es
obligatorio
tratarlas
RuntimeExceptionUsuario
También denominadas:
Excepciones comprobadas
También denominadas:
Excepciones no comprobadas
© M. Aldea y M. González
29/03/10
14
Prácticas de Programación
Tema 4. Tratamiento de errores
ArithmeticException
ClassCastException
4.4 Jerarquía de las excepciones
ArrayIndexOutOfBoundsException
Algunas excepciones RuntimeException
También se denominan excepciones no comprobadas
Error aritmético (x/0, ...)
Índice de array fuera de límites
(<0 o >=length)
Intento de convertir a una clase
incorrecta
Argumento ilegal en la llamada a un
método
Indice fuera de límites (p.e., en un
Vector)
Tamaño de array negativo
Uso de una referencia nula
Formato de número incorrecto
Indice usado en un String está fuera
de límites
NegativeArraySizeException
IndexOutOfBoundsException
NullPointerException
NumberFormatException
StringIndexOutOfBounds
IllegalArgumentException
Prácticas de Programación
© M. Aldea y M. González
29/03/10
15
Tema 4. Tratamiento de errores
4.5 Lanzar excepciones
4.5 Lanzar excepciones
Se lanzan con la palabra reservada throw:
throw new ClaseExcepción();
En ocasiones puede ser más conveniente usar el constructor con
un string como parámetro
throw new ClaseExcepción("mensaje");
• que sirve para dar información adicional sobre la causa de la
excepción
Ejemplo:
...
if (clave==null) {
throw new NullPointerException("clave es nula");
}
...
Prácticas de Programación
Tema 4. Tratamiento de errores
© M. Aldea y M. González
29/03/10
16
4.5 Lanzar excepciones
Lanzar la misma excepción
En algunas ocasiones un manejador puede volver a lanzar la
misma excepción:
catch (ClaseExcepción e) {
parte del tratamiento de la excepción;
throw e;
}
• puede ser útil cuando se desea realizar en el manejador parte
del tratamiento de la excepción
- y dejar que el resto del tratamiento le haga el método superior
Prácticas de Programación
Tema 4. Tratamiento de errores
© M. Aldea y M. González
29/03/10
17
4.6 Usar nuestras propias excepciones
o RuntimeException
4.6 Usar nuestras propias excepciones
Comentarios de: Prácticas de Programación - Tema 4. Tratamiento de errores (0)
No hay comentarios