Anda di halaman 1dari 22

Estructura de las Aplicaciones Orientadas a Objetos

Excepciones

Programacin Orientada a Objetos Facultad de Informtica

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

Anticiparse a lo que podra ir mal

Lanzamiento y tratamiento de excepciones Aserciones

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

Causas de situaciones de error

Implementacin incorrecta

No se ajusta a las especificaciones ndice invlido Referencia nula P.ej. debido a una extensin de la clase

Peticin de objeto inapropiada


Estado de objeto inapropiado o incosistente

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

No siempre se trata de errores de programacin

Hay errores que vienen del entorno:


URL incorrecta Interrupcin de las comunicaciones de red Ficheros que no existen Permisos inapropiados

El procesamiento de ficheros suele ocasionar errores:


Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

Explorando los errores


Explora posibles errores en los proyectos de la agenda (address-book) Dos aspectos:


Informe de errores Tratamiento de errores

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

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?

Esto implica diferencias significativas en la implementacin

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

Aspectos a tener en cuenta


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?

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

Ejemplo

Crea un objeto AddressBook Intenta eliminar una entrada Ocurre un error de ejecucin

De quin es la culpa?

La anticipacin y la prevencin son preferibles a quejarse intilmente

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

Programacin Orientada a Objetos

Valores de los argumentos

Los argumentos son el primer punto de vulnerabilidad de un objeto servidor


Los argumentos de un constructor inicializan el estado Los argumentos de los mtodos contribuyen a la evolucin del comportamiento

La comprobacin de argumentos es una medida defensiva

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

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--; } }

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

10

Informe de errores por el servidor

Cmo informar de los errores en los argumentos?

Al usuario?
Hay un usuario humano? Podra resolver el problema?

Al objeto cliente?
Devuelve un valor de diagnstico Lanza una excepcin

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

11

Devolviendo un diagnstico (clsico)


public boolean removeDetails(String key) { if(keyInUse(key)) { ContactDetails details = book.get(key); book.remove(details.getName()); book.remove(details.getPhone()); numberOfEntries--; return true; } else { return false; } }

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

12

Problemas del planteamiento clsico

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

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

13

Mecanismo de excepciones

En lenguajes de POO modernos se usan excepciones El cdigo se estructura:

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

El cdigo del cliente se puede estructurar en dos partes:


Secuencia normal de ejecucin Tratamiento de excepciones: qu hacer cuando se sale del flujo normal de ejecucin por la ocurrencia de alguna excepcin

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

14

Excepciones en Java

Las excepciones son objetos

De la clase Exception, que hereda de Throwable

En Java puede haber dos tipos de excepciones:

Excepciones que no requieren comprobarse


Errores y excepciones de ejecucin Clase RuntimeException

Excepciones que hay que comprobar


Todas las dems Heredan de la clase Exception

Cuando ocurre una excepcin se dice que se lanza (throw)


throw new Excepcin();

La excepcin puede ser capturada para tratarla (catch)


catch (Excepcin e) { tratamiento(); }

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

15

Lanzamiento de una excepcin


/** * Look up a name or phone number and return the * corresponding contact details. * @param key The name or number to be looked up. * @return The details corresponding to the key, * or null if there are none matching. * @throws NullPointerException if the key is null. */ public ContactDetails getDetails(String key) { if(key == null) { throw new NullPointerException( "null key in getDetails"); } return book.get(key); }

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

16

Lanzamiento de una excepcin

Se construye un objeto de excepcin:


new ExceptionType("...");

Se lanza el objeto de excepcin:


throw ...

Documentacin con Javadoc:

@throws ExceptionType razn

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

17

Efectos de una excepcin


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

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

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

Excepciones sin comprobacin obligatoria


Subclases de RuntimeException Son las que puede lanzar la MVJ


Normalmente representan una condicin fatal del programa No las comprueba el compilador y es difcil saber cundo y por qu pueden suceder Pero a veces se puede considerar que alguna condicin podra ocasionarlas
Se suelen tratar en algn nivel superior de forma genrica

Excepciones con comprobacin


Subclases de Exception Las comprueba el compilador


Si no se consideran en el cdigo, el compilador indica un error Estas excepciones son lanzadas por mtodos que se usan en el cdigo (por eso las reconoce el compilador)

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

20

Algunas excepciones comunes en Java

No comprobadas, subclases de RuntimeException:

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)

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

21

Algunos errores comunes en Java

NoSuchMethodError

La aplicacin llama a un mtodo que ya no existe en la definicin de la clase


Slo puede ocurrir si la clase cambia su definicin en tiempo de ejecucin

NoClassDefFoundError

La MVJ intenta cargar una clase pero no se encuentra


Suele ocurrir si el CLASSPATH no est bien o si la clase (.class) no est donde se espera

ClassFormatError

La MVJ intenta cargar una clase desde un fichero incorrecto


Suele ocurrir cuando el fichero .class est corrupto, o si no es un fichero .class

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

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); }

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

23

Prevencin de la creacin de objetos


public ContactDetails(String name, String phone, String address) { if(name == null) { name = ""; } if(phone == null) { phone = ""; } if(address == null) { address = ""; } this.name = name.trim(); this.phone = phone.trim(); this.address = address.trim(); if(this.name.length() == 0 && this.phone.length() == 0) { throw new IllegalStateException( "Either the name or phone must not be blank."); } }

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

24

La clusula throws

Los mtodos que lanzan una excepcin controlada deben declararla con la clusula throws :

public void saveToFile(String destinationFile) throws IOException

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

25

Tratamiento de excepciones en el cliente

Hay dos mecanismos para gestionar una excepcin:


Tratarla en el mtodo que las captura Propagarla al mtodo llamante


Si al final nadie captura la excepcin, el programa acaba y se lista la traza de la pila de llamadas

Cmo se haga depende del diseo general del sistema

Se manejan en un bloque try-catch (si no, se propagan hacia el llamante):


public void unMtodo(){ try{ //cdigo donde se puede lanzar la excepcin e }catch(Exception e){ //cdigo que gestiona la exception e } }

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

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; }

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

27

Se pueden capturar mltiples excepciones

El orden de captura de las excepciones es importante

Las ms genricas se deberan capturar al final

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

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

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) } }

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

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

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

30

Gestin genrica de excepciones

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

public void miMtodo(){ try{ //cdigo }catch(Throwable e){ System.out.println(e.printStackTrace()); } }


Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

31

Definicin de nuevas excepciones

Excepciones definidas por el usuario

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

Puede incluir informacin de la causa y de recuperacin

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

32

Ejemplo de definicin de excepcin


public class NoMatchingDetailsException extends Exception { private String key; public NoMatchingDetailsException(String key) { this.key = key; } public String getKey() { return key; } public String toString() { return "No details matching '" + key + "' were found."; } }

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

33

Aserciones

Usadas para comprobaciones de consistencia interna

P.ej. sobre el estado de un objeto

Normalmente se usan durante el desarrollo y se eliminan en la versin de producto

Con una opcin del compilador

Java tiene una sentencia assert

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

34

Sentencia de asercin en Java

Tiene dos formas:


assert boolean-expression assert boolean-expression : expression

La expresin booleana declara algo que debera ser cierto en ese punto Se lanza un AssertionError si fuera falsa

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

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"; }

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

36

Gua para aserciones


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;

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

37

Recuperacin de errores

Los clientes deberan tratar las notificaciones de errores


Comprobar los valores de retorno No ignorar las excepciones Por ejemplo reintentos

Incluir cdigo para intentar la recuperacin

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

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

Programacin Orientada a Objetos

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

Puede incrementar el acoplamiento cliente-servidor

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

40

Evitar una excepcin


// Use the correct method to put details // in the address book. if(book.keyInUse(details.getName() || book.keyInUse(details.getPhone()) { book.changeDetails(details); } else { book.addDetails(details); }

El mtodo addDetails podra lanzar ahora una excepcin no comprobada

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

41

Resumen

Los errores en tiempo de ejecucin ocurren por mltiples motivos


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

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

42

Ventajas del mecanismo de excepciones

Separacin del tratamiento de errores del resto del cdigo del programa

Flujo del programa ms sencillo Evita manejos de cdigos de error

Propagacin de errores a lo largo de la pila de llamadas a mtodos


Evitar retornos continuos en caso de error Evitar la necesidad de argumentos adicionales


Por ejemplo, el clsico boolean

Agrupamiento y definicin de tipos de errores como clases


Jerarquas de excepciones Tratar errores a diferentes niveles de especificidad

Juan Pavn Mestras Facultad de Informtica UCM, 2007-08

Programacin Orientada a Objetos

43

Anda mungkin juga menyukai