Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de...

33
1 Manejo de Excepciones M. Consuelo Franky Julio Carreño Pontificia Universidad Javeriana

Transcript of Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de...

Page 1: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

1

Manejo de Excepciones

M. Consuelo Franky – Julio Carreño

Pontificia Universidad Javeriana

Page 2: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

2

Temario

Captura de excepciones

Excepciones estándares

Cómo provocar una excepción

Cómo definir nuevas excepciones

Propagación de excepciones

Page 3: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

3

1.

Captura de excepciones

Page 4: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

4

Qué pasa si no se capturan excepciones?

Mensajes poco

amistosos con el

usuario cuando

hay problemas

Page 5: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

5

Capturando una Excepción

Mensajes

amistosos con el

usuario cuando

hay problemas

Page 6: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

6

La captura de excepciones permiten

una programación clara

El flujo normal de operaciones se separa del

tratamiento de errores

Evita tener que chequear códigos de error después de

cada operación

Captura de la excepción más general :

try {

procesarDatos();

mostrarResultados(); // no se realiza si hay

// error en procesarDatos

}

catch (Exception e) {

tratamientoErrores();

}

Page 7: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

Flujo de control try/catch

Page 8: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

8

Acciones al capturar la excepción

Se interrumpe la operación del try que produjo la

excepción y se realizan las operaciones especificadas en el catch

No se realizan más operaciones del try

Operaciones típicas en el catch de una excepción e

System.out.println (“hubo un error” + e.getMessage());

System.err.println (e.toString()); //clase de excepcion

// y descripcion

e.printStackTrace(); // pila de invocaciones

return; // si se quiere terminar el actual metodo

System.exit(-1); // si se quiere terminar el programa

Page 9: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

9

Captura de varias posibles excepciones try {

procesarDatos();

mostrarResultados();

}

catch (IOException e) {

tratamientoErroresIO();

}

catch (ArithmeticException e) {

tratamientoErroresAritmeticos();

}

catch (Exception e) {

cualquierOtroError();

}

finally { //de todas maneras se hace esta parte:

//despues de trat. normal o de excepcion

cerrarArchivos();

}

Observar el finally : se ejecuta haya o no haya excepción.

Declarar variables antes del try para poderlas usar en todas las secciones (por ej: la

variable archivo)

Page 10: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

Flujo de control del bloque finally

Page 11: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

try / catch / finally anidados

Page 12: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

12

2.

Excepciones estándares

Page 13: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

13

Todas las excepciones son subclases

de Exception ClassNotFoundException

IOException

• EOFException

• FileNotFoundException

• MalformedURLException

• UnknownHostException

• SocketException

RuntimeException

• ArithmeticException

• IndexOutOfBoundsException

• NullPointerException

• SecurityException y muchas más...

Page 14: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

Tipos de Excepciones

Las excepciones son capturables, los

errores no

Page 15: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

15

3.

Cómo provocar una excepción

Page 16: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

16

Definir un método que provoque una

excepción cuando haya una

condición anormal

Ejemplo: no admitir información de un empleado cuya

cédula esté fuera de rango:

public class Empleado {

String nombre;

long cedula;

public void setNombre (String n) {

this.nombre = n;

}

public void setCedula (long c) throws Exception {

if (c>0 && c <= 99999999)

this.cedula = c;

else

throw new Exception (“cedula fuera de rango”);

;

}

}

Observar: throw new para lanzar la excepción

y throws en el encabezado del método

Page 17: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

17

Invocación del método que provoca la excepción : lo

hace dentro de un try-catch

Empleado s = new Empleado ();

try {

s.setNombre ("Pedro Perez");

s.setCedula (415556666);

}

catch (Exception e) {

System.out.println (e.getMessage());

}

Page 18: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

18

4.

Cómo definir nuevas excepciones

Page 19: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

19

Definir una nueva excepción

Permite definir excepciones apropiadas para la

aplicación

Definición como subclase de otra excepción :

public class ExcepcionCedula extends Exception {

private String mensaje;

ExcepcionCedula (String s) {

mensaje = s;

}

public String toString () {

return "ExcepcionCedula " + mensaje;

}

}

Page 20: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

20

Provocar la nueva excepción :

public class Empleado {

String nombre;

long cedula;

public void setNombre (String n) {

nombre = n;

}

public void setCedula (long c)

throws ExcepcionCedula {

if (c < 0 )

throw new ExcepcionCedula ("cedula negativa");

else if ( c > 99999999)

throw new ExcepcionCedula ("cedula muy grande");

else

cedula = c;

;

}

}

Page 21: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

Las excepciones definidas por el

programador pueden tener varios atributos

Permite personalizar los mensajes y mostrar información

más útil sobre la excepción

• el constructor debe asignar min y max a los atributos

• toString() puede mostrar el mensaje, el minimo y el maximo

this.minimo = min;

this.maximo = max;

Page 22: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

22

5.

Propagación de una excepción

Page 23: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

23

La responsabilidad de capturar una excepción se puede

transferir al que invoca el método que produce la

excepción (propagar hacia atrás):

Aplicacion

(test) Novedades Empleado setCedula ingresarEmp

throw new

y

throws

throws

catch

1 2 3

Una excepción puede ser :

- lanzada (throw new)

- propagada hacia atrás (throws)

- manejada (catch)

Page 24: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

24

ejemplo:

public class Test{

public static void main (String[] args){

Novedades nov = new Novedades();

try {

nov.ingresarEmp("Pedro Perez", 415556666);

}

catch (ExcepcionCedula e) {

System.out.println (e.toString());

}

catch (Exception e) {

e.printStackTrace();

}

...

}

}

1

Page 25: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

25

public class Novedades {

void ingresarEmp (String nombre, long cedula)

throws ExcepcionCedula {

Empleado s = new Empleado ();

s.setNombre ("Pedro Perez");

s.setCedula (415556666);

}

}

public class Empleado {

String nombre; long cedula;

public void setNombre (String n) {

nombre = s;

}

public void setCedula (long c)

throws ExcepcionCedula {

if (c < 0 )

throw new ExcepcionCedula ("cedula negativa");

else if ( c > 99999999)

throw new ExcepcionCedula ("cedula muy grande");

else

cedula = c;

;

}

}

2

3

Page 26: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

26

Un método puede provocar varias clases de excepciones :

void ingresarEmp (String nombre, long cedula)

throws ExcepcionCedula, ExcepcionNombre {

....

}

Un método puede provocar una excepción y capturar otra :

public void setCedula (long c) throws ExcepcionCedula {

try {

long maxCedula = leerCedulaMaxima();

if (c>0 && c <= maxCedula)

cedula = c;

else

throw new ExcepcionCedula (“cedula errada”);

;

}

catch (IOException e) {

System.out.println (“no pudo leer maxCedula”);

}

}

Buena práctica: solo el Test captura excepciones para informar al usuario

Page 27: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

27

Ejemplo 2: propagación de excepciones con objetos

Chance que se quieren grabar en disco

TestTeclado Operador Chance

grabarChance() agregarChance()

throws throws

catch

1 2 3

Grabador

grabarChance()

throw new IOException

y

throws

4

Page 28: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

Otro ejemplo de Propagación de Excepciones

clase LecturaDatos

clase Test

Page 29: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

Manejadores y propagadores de

excepciones

En una cadena de invocaciones toda excepción propagada hacia atrás debe ser

capturada por alguna de las clases iniciales en la cadena

Page 30: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

30

6.

Esquema de los métodos que

trabajan con archivos

(clase ManejoArchivos)

Page 31: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

31

Objetivo: asegurar el cierre de archivos y al mismo

tiempo propagar toda posible excepción al Test

Debe usar try catch para poder cerrar los archivos en el finally

Todo catch lanza una excepción propia PersistenceException que es

propagada al Test public static void cargarArchivo(Iempresa empresa, String nombreArchivo) throws PersistenciaException{ File arch = null; FileInputStream fis = null; try{ arch = new File("./" + nombreArchivo);

fis = new FileInputStream(arch); Scanner in = new Scanner(fis); //TODO: procesar el archivo } catch(FileNotFoundException e){ throw new PersistenciaException ("El archivo no existe " + e.getMessage());

} catch ( Exception e){ throw new PersistenciaException ("Ocurrio un error leyendo el archivo " + e.getMessage()); } finally{ try { fis.close(); } catch (IOException e) { throw new PersistenciaException ("Ocurrio error cerrando el archivo "+e.getMessage()); } } }

Page 32: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

32

Excepción PersistenceException:

public class PersistenciaException

extends Exception {

public PersistenciaException(String arg) {

super(arg);

}

}

Page 33: Manejo de Excepciones - sophia.javeriana.edu.cocbustaca/docencia/POO-2016-01/... · Manejo de Excepciones M. Consuelo Franky – Julio Carreño Pontificia Universidad Javeriana .

33

Ejercicio Defina una enumeración TipoResultado para los posibles resultados de operaciones

bancarias: EXITO, FRACASO, NO _HAY_FONDOS, NO_EXISTE

Defina una enumeracion TipoMovimiento para los posibles movimientos sobre una cuenta bancaria: CONSIGNACION, RETIRO

Cada Cuenta tiene como atributos: codigo y saldo y una constante de clase que indica cuál debe ser el saldo mínimo. El constructor de Cuenta recibe codigo y saldo inicial y debe provocar una excepción cuando el saldo inicial es menor que el saldo mínimo. El método realizarMovimiento no debe dejar el saldo de una cuenta por debajo del saldo mínimo y debe retornar el resultado EXITO o NO_HAY_FONDOS

Modele una clase Banco que tiene como atributos su nombre y una lista de Cuentas. Como métodos tiene: agregarCuenta, realizarMovimiento; este último recibe como parámetros el código de la cuenta, el tipo de movimiento y el monto y puede retornar como resultado EXITO, NO_HAY_FONDOS, NO_EXISTE (la cuenta).

Escriba un TestTeclado que instancie un objeto Banco y le agregue varias cuentas . Debe capturar la excepción cuando trata de instanciar una cuenta con saldo inicial por debajo del saldo mínimo e informarle al usuario.

El TestTeclado también debe capturar excepción cuando el usuario suministra letras para datos numéricos e informar al usuario el error.

El TestTeclado luego puede hacer movimientos sobre las cuentas indicando al usuario el resultado.