Excepciones
Juan Pavn Mestras Dep. Ingeniera del Software e Inteligencia Artificial Universidad Complutense Madrid
Basado en el curso Objects First with Java - A Practical Introduction using BlueJ, David J. Barnes, Michael Klling
Conceptos
Programacin a la defensiva
Implementacin incorrecta
No se ajusta a las especificaciones ndice invlido Referencia nula P.ej. debido a una extensin de la clase
URL incorrecta Interrupcin de las comunicaciones de red Ficheros que no existen Permisos inapropiados
Programacin a la defensiva
Interaccin cliente-servidor
Tiene que asumir un servidor que todos los clientes se comportarn adecuadamente? O debera asumir que algunos clientes pueden tener un comportamiento hostil?
Cuntas comprobaciones tiene que hacer un servidor en las llamadas a sus mtodos? Cmo informar de los errores? Cmo puede anticiparse un cliente a los fallos? Cmo debera tratar un cliente un fallo?
Ejemplo
Crea un objeto AddressBook Intenta eliminar una entrada Ocurre un error de ejecucin
De quin es la culpa?
public void removeDetails(String key) { ContactDetails details = book.get(key); book.remove(details.getName()); book.remove(details.getPhone()); numberOfEntries--; }
Juan Pavn Mestras Facultad de Informtica UCM, 2007-08
Los argumentos de un constructor inicializan el estado Los argumentos de los mtodos contribuyen a la evolucin del comportamiento
Comprobacin de la clave
public void removeDetails(String key) { if(keyInUse(key)) { ContactDetails details = book.get(key); book.remove(details.getName()); book.remove(details.getPhone()); numberOfEntries--; } }
10
Al usuario?
Hay un usuario humano? Podra resolver el problema?
Al objeto cliente?
Devuelve un valor de diagnstico Lanza una excepcin
11
12
El cliente comprueba si todo ha ido bien o no segn lo que devuelva el mtodo llamado:
if ( objeto.funcin(parmetros) == UN_ERROR ) { // tratar error } else { // cdigo normal }
Mecanismo simple Pero complica el cdigo (cuando hay varias funciones empiezan a anidarse los if-else) Hay errores de ejecucin que no pueden capturarse fcilmente
Por ejemplo, en C++ al quedarse sin memoria al hacer new o cuando se cae una conexin
13
Mecanismo de excepciones
En el cdigo del objeto servidor se puede indicar la ocurrencia de una excepcin y esto ocasiona la finalizacin inmediata del mtodo
Por ejemplo el incumplimiento de alguna condicin necesaria para la ejecucin del mtodo Tambin pueden ocurrir excepciones del entorno (no originadas explcitamente por la aplicacin)
Sncronas: divisin por cero, acceso fuera de los lmites de un array, puntero nulo Asncronas: algn fallo del sistema, cada de comunicaciones, falta de memoria
14
Excepciones en Java
15
16
17
El mtodo lanzado acaba prematuramente No se devuelve ningn valor de retorno El control no vuelve al punto de llamada del cliente
Con lo cual el cliente no puede despreocuparse Un cliente puede capturar (catch) una excepcin
18
Excepciones en Java
Comprobadas, el compilador obliga a considerarla
Throwable
Exception
Error
ExcepcinUsuario
RuntimeException
Sin comprobacin las lanza la MVJ
ExcepcinUsuarioNoComprobada
Juan Pavn Mestras Facultad de Informtica UCM, 2007-08 Programacin Orientada a Objetos
19
Categoras de excepcin
20
NullPointerException
Cuando se enva un mensaje a un objeto null
ArrayIndexOutOfBoundsException
Cuando se accede a un ndice ilegal en un array
Comprobadas:
IOException
Clase genrica para las excepciones que se producen en operaciones de E/S
NoSuchMethodException
Cuando no se encuentra un mtodo
ClassNotFoundException
Cuando una aplicacin intenta cargar una clase pero no se encuentra su definicin (el fichero .class correspondiente)
21
NoSuchMethodError
NoClassDefFoundError
ClassFormatError
22
Comprobacin de argumentos
public ContactDetails getDetails(String key) { if(key == null) { throw new NullPointerException( "null key in getDetails"); } if(key.trim().length() == 0) { throw new IllegalArgumentException( "Empty key passed to getDetails"); } return book.get(key); }
23
24
La clusula throws
Los mtodos que lanzan una excepcin controlada deben declararla con la clusula throws :
25
26
La sentencia try
1. La excepcin se lanza aqu try { addressbook.saveToFile(filename); tryAgain = false; 2. El control se transfiere aqu } catch(IOException e) { System.out.println("Unable to save to " + filename); tryAgain = true; }
27
public void unMtodo(){ try{ // cdigo donde se puede lanzar la excepcin e1 // cdigo donde se puede lanzar la excepcin e2 }catch(MiExcepcin e1){ // cdigo que gestiona la exception e1 Exception }catch(Exception e2){ // cdigo que gestiona la exception e2 } }
MiExcepcin
28
La clusula finally
Se ejecuta siempre al final, despus del ltimo bloque catch Generalmente se utiliza para hacer limpieza
Cerrar ficheros, conexiones, etc. public void miMtodo(){ try{ // cdigo donde se puede lanzar la excepcin e1 // cdigo donde se puede lanzar la excepcin e2 } catch(MiExcepcin e1){ // cdigo que gestiona la exception e1 } catch(Exception e2){ // cdigo que gestiona la exception e2 } finally{ //cdigo de limpieza, liberar recursos (close) } }
29
La clusula finally
Se ejecuta incluso cuando haya una sentencia de return dentro de las clusulas try o catch Una excepcin no capturada o propagada tambin pasa antes por la clusula finally
30
Se puede capturar una excepcin genrica para capturar todas las que sean de ese tipo y subtipos
Por ejemplo, capturando Exception se pueden capturar todas las excepciones posibles Y capturando Throwable todas las excepciones y errores
Lo ms genrico es imprimir la traza de la pila de llamadas y as se ve dnde ha ocurrido
31
Se puede extender RuntimeException para excepciones no comprobadas O Exception para excepciones comprobadas
La definicin de nuevos tipos permite una mejor informacin sobre la causa de la excepcin
32
33
Aserciones
34
La expresin booleana declara algo que debera ser cierto en ese punto Se lanza un AssertionError si fuera falsa
35
Sentencia assert
public void removeDetails(String key) { if(key == null){ throw new IllegalArgumentException("..."); } if(keyInUse(key)) { ContactDetails details = book.get(key); book.remove(details.getName()); book.remove(details.getPhone()); numberOfEntries--; } assert !keyInUse(key); assert consistentSize() : "Inconsistent book size in removeDetails"; }
36
No son una alternativa al lanzamiento de excepciones Se usan para comprobaciones internas Se eliminan para el cdigo de producto final No incluyen funcionamiento normal:
// Incorrect use: assert book.remove(name) != null;
37
Recuperacin de errores
Comprobar los valores de retorno No ignorar las excepciones Por ejemplo reintentos
38
Intento de recuperacin
// Try to save the address book. boolean successful = false; int attempts = 0; do { try { addressbook.saveToFile(filename); successful = true; } catch(IOException e) { System.out.println("Unable to save to " + filename); attempts++; if(attempts < MAX_ATTEMPTS) { filename = an alternative file name; } } } while(!successful && attempts < MAX_ATTEMPTS); if(!successful) { Report the problem and give up; }
Juan Pavn Mestras Facultad de Informtica UCM, 2007-08
39
Evitar errores
Los clientes pueden a veces utilizar mtodos de consulta del servidor para evitar errores
Clientes ms robustos implica que los servidores son ms fiables Se pueden usar excepciones no comprobadas Simplifica la lgica de los clientes
40
41
Resumen
Una llamada inapropiada de un cliente a un objeto servidor Un servidor incapaz de completar una peticin Un error de programacin en el cliente o en el servidor
La programacin a la defensiva anticipa errores, tanto en cliente como en servidor Las excepciones permiten la implementacin de mecanismos de informe y recuperacin de errores
42
Separacin del tratamiento de errores del resto del cdigo del programa
43