Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Tratamiento de errores en la lectura de archivos: clásico vs. excepciones - Prof. Durán, Apuntes de Ingeniería Infórmatica

En este documento se comparan dos métodos para manejar errores al leer archivos: el método clásico y el manejo de excepciones. El método clásico utiliza códigos de error y se basa en la secuencia de ejecución, mientras que el manejo de excepciones permite una respuesta más específica y flexible a errores inesperados. El documento incluye ejemplos de código en java y explica el funcionamiento de métodos como try-catch y finally.

Tipo: Apuntes

2010/2011

Subido el 04/05/2011

alvaro_tron-1
alvaro_tron-1 🇪🇸

4

(1)

2 documentos

1 / 17

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Laboratorio de Tecnología de Objetos
Departamento de Lenguajes y Ciencias de la
Computación 1
1
Tratamiento de excepciones
Sw. tolerante a fallos. El concepto de excepción.
Captura y tratamiento de excepciones.
Propagación de excepciones.
Excepciones predefinidas.
Definición de nuevas excepciones.
Introd. a la POO
El lenguaje Java
Estruct. Biblioteca
Excepciones
Colecciones
Entrada y salida
GUIs
Índice
2
El concepto de “excepción”
•Una excepción es un evento que interrumpe el flujo
normal de instrucciones durante la ejecución de un
programa.
Las aplicaciones pueden producir muchas clases
de errores de diversos niveles de severidad:
un fichero que no puede encontrarse o no existe,
un índice fuera de rango,
un enlace de red que falla,
un fallo en un disco duro,
...
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff

Vista previa parcial del texto

¡Descarga Tratamiento de errores en la lectura de archivos: clásico vs. excepciones - Prof. Durán y más Apuntes en PDF de Ingeniería Infórmatica solo en Docsity!

Departamento de Lenguajes y Ciencias de la

1

Tratamiento de excepciones

Sw. tolerante a fallos. El concepto de excepción.

Captura y tratamiento de excepciones.

Propagación de excepciones.

Excepciones predefinidas.

Definición de nuevas excepciones.

Introd. a la POO El lenguaje Java Estruct. Biblioteca Excepciones Colecciones Entrada y salida GUIs

Índice

2

El concepto de “excepción”

• Una excepción es un evento que interrumpe el flujo

normal de instrucciones durante la ejecución de un

programa.

• Las aplicaciones pueden producir muchas clases

de errores de diversos niveles de severidad:

 un fichero que no puede encontrarse o no existe,

 un índice fuera de rango,

 un enlace de red que falla,

 un fallo en un disco duro,

Departamento de Lenguajes y Ciencias de la

3

La necesidad de tratar los

errores

  • Consideremos el (pseudo)código del siguiente método que lee un fichero y

copia su contenido en memoria.

leerFichero() { abrir el fichero; determinar la longitud del fichero; reservar la memoria suficiente; copiar el fichero en memoria; cerrar el fichero; }

¿Qué pasa si el fichero no puede abrirse? ¿Qué pasa si no puede

determinarse la longitud del

fichero?

¿Qué pasa si

no puede

reservarse

memoria

suficiente?

¿Qué pasa si

falla la lectura?

¿Qué pasa si el fichero no puede cerrarse?

4

Tratamiento clásico de

errores

tipoDeCódigoDeError leerFichero { tipoDeCódigoDeError códigoDeError = 0; abrir el fichero; if (el fichero está abierto) { determinar la longitud del fichero; if (se consigue la longitud del fichero) { reservar la memoria suficiente; if (se consigue la memoria) { copiar el fichero en memoria; if (falla la lectura) { códigoDeError = -1; } } else { códigoDeError = -2; } } else { códigoDeError = -3; } cerrar el fichero; if (el fichero no se cerró && códigoDeError == 0){ códigoDeError = -4; } else { códigoDeError = códigoDeError and –4; } } else { códigoDeError = -5; } return códigoDeError ; }

•Difícil de leer

•Se pierde el flujo lógico de ejecución

•Difícil de modificar

Departamento de Lenguajes y Ciencias de la

7

método1 { … call método2; … } método2 { … call método3; … }

método3 { … call leerFichero; … }

método1 { try { … call método2; … } catch (excepción) { procesar error; } }

método2 throws excepción { … call método3; … } método3 throws excepción { … call leerFichero; … }

método1 { … tipoDeCódigoDeError códigoDeError; códigoDeError = call método2; if (códigoDeError != 0) procesar error; else … } tipoDeCódigoDeError método2 { … tipoDeCódigoDeError códigoDeError; códigoDeError = call método3; if (códigoDeError != 0) return códigoDeError; else … }

tipoDeCódigoDeError método3 { … tipoDeCódigoDeError códigoDeError; códigoDeError = call leerFichero; if (códigoDeError != 0) return códigoDeError; else … }

con excepciones

Tratamiento clásico

8

Captura y tratamiento de

excepciones

import java.io.*;

public class ListaDeNúmeros { private int[] v; private static final int SIZE = 10;

public ListaDeNúmeros() { v = new int[SIZE]; for (int i = 0; i < SIZE; i++) { v[i] = i; } }

public void escribeLista() { PrintWriter out = new PrintWriter( new FileWriter(“out.txt”)); for (int i = 0; i < SIZE; i++) { out.println(“valor: “ + i + “ = “ + v[i]); } out.close(); } }

¡Este código no compila!

Si el fichero no puede abrirse lanza

una excepción IOException

Si el índice está fuera de rango lanza una excepción

ArrayIndexOutOfBoundsException

Las excepciones comprobadas

(checked exceptions), como

IOException, han de ser

tratadas obligatoriamente en

el programa.

Departamento de Lenguajes y Ciencias de la

9

La instrucción try-catch

  • Las instrucciones que pueden lanzar excepciones se encierran en

bloques try.

  • Los manejadores de excepciones se incluyen en bloques catch

asociados a éstos.

try { ... } catch ( TipoDeExcepción nombre ) { ... } catch ( TipoDeExcepción nombre ) { ... } ...

  • Las instrucciones de un bloque catch son ejecutadas cuando se

invoca dicho manejador de excepciones.

10

El tratamiento de las

excepciones

public void escribeLista() { PrintWriter out = null; try { out = new PrintWriter(new FileWriter(“out.txt”)); for (int i = 0; i < SIZE; i++) { out.println(“valor: ” + i + “ = ” + v[i]); } out.close(); } catch (ArrayIndexOutOfBoundsException e) { System.err.println(“Índice fuera de rango”); } catch (IOException e) { System.err.println(“Error al abrir o cerrar out.txt"); } }

  • Los manejadores pueden hacer más: preguntar al usuario por la decisión a tomar,

recuperarse del error o terminar el programa.

  • También podemos poner cada una de las instrucciones que pueden lanzar

excepciones en bloques try diferentes y proporcionar manejadores de

excepciones para cada uno.

Departamento de Lenguajes y Ciencias de la

13

1: Ocurre una excepción

IOException

public void escribeLista() { PrintWriter out = null; try { out = new PrintWriter(new FileWriter(“out.txt”)); for (int i = 0; i < SIZE; i++) { out.println(“valor: ” + i + “ = ” + v[i]); } } catch (ArrayIndexOutOfBoundsException e) { System.err.println(“Índice fuera de rango”); } catch (IOException e) { System.err.println(“out.txt no puede abrirse"); } finally { if (out != null) { out.close(); } } }

14

2: Ocurre una excepción

ArrayIndexOutOfBoundsExcept

ion

public void escribeLista() { PrintWriter out = null; try { out = new PrintWriter(new FileWriter(“out.txt”)); for (int i = 0; i < SIZE; i++) { out.println(“valor: ” + i + “ = ” + v[i]); } } catch (ArrayIndexOutOfBoundsException e) { System.err.println(“Índice fuera de rango”); } catch (IOException e) { System.err.println(“out.txt no pude abrirse"); } finally { if (out != null) { out.close(); } } }

Departamento de Lenguajes y Ciencias de la

15

3: El bloque try termina normalmente

public void escribeLista() { PrintWriter out = null; try { out = new PrintWriter(new FileWriter(“out.txt”)); for (int i = 0; i < SIZE; i++) { out.println(“valor: ” + i + “ = ” + v[i]); } } catch (ArrayIndexOutOfBoundsException e) { System.err.println(“Índice fuera de rango”); } catch (IOException e) { System.err.println(“out.txt no pude abrirse"); } finally { if (out != null) { out.close(); } } }

16

Tratamiento de excepciones por

public class DivisiónPorCerodefecto {

public void división(int num1, int num2) { System.out.println( num1 + " / " + num2 + " = " + (num1 / num2)); System.out.println("Volviendo de división."); }

public static void main(String[] args) { new DivisiónPorCero().división(10, 0); System.out.println("Volviendo de main."); } }

Salida: java.lang.ArithmeticException: / by zero at DivisiónPorCero.división(DivisiónPorCero.java:4) at DivisiónPorCero.main(DivisiónPorCero.java:9) Exception in thread "main"

Departamento de Lenguajes y Ciencias de la

19

Propagación de excepciones

  • En ciertas ocasiones es deseable no tratar la excepción y dejar que

sea otro método en la pila de llamadas el que lo haga.

  • Un método ha de especificar qué excepciones puede lanzar.
  • Las excepciones comprobadas han de ser tratadas o propagadas.

public void escribeLista() throws IOException, ArrayIndexOutOfBoundsException { PrintWriter out = new PrintWriter( new FileWriter(“out.txt”)); for (int i = 0; i < SIZE; i++) { out.println(“valor: ” + i + “ = ” + v[i]); } out.close(); }

20

Redefinición de métodos con cláusula

throws

La definición del método en la subclase sólo puede especificar un sub-

conjunto de las clases de excepciones (incluidas sus subclases) especifi-

cadas en la cláusula throws del método redefinido en la superclase.

class A {

protected void métodoX()

throws Excepción1, Excepción2, Excepción3 {

class B extends A {

protected void métodoX()

throws Excepción1, Subc1Excepción3, subc2Excepción3 {

Departamento de Lenguajes y Ciencias de la

21

Excepciones relacionadas

public void escribeLista() {

try {

PrintWriter out = new PrintWriter(

new FileWriter("out.txt"));

for (int i = 0; i < SIZE; i++) {

out.println("valor: " + i + " = " + v[i]);

out.close();

} catch (FileNotFoundException e) {

System.err.println("out.txt no ha sido encontrado");

} catch (IOException e) {

System.err.println("Error de entrada/salida");

22

La instrucción throw

• Las excepciones son lanzadas con la instrucción throw.

public void pop() throws EmptyStackException { if (size == 0) { throw new EmptyStackException(); } setObjectAt(size - 1, null); size--; }

Departamento de Lenguajes y Ciencias de la

25

La clase Throwable (II)

String getMessage()

Devuelve el texto con el mensaje de error del objeto.

void printStackTrace()

Imprime este objeto y su traza en la salida de errores

estándar.

void printStackTrace(PrintStream s)

Imprime este objeto y su traza en el canal especificado.

void printStackTrace(PrintWriter s)

Imprime este objeto y su traza en el print writer

especificado.

26

Ejemplo: información sobre las

excepciones

public class Ejemplo { void aux() { try { int a[] = new int[2]; a[4] = 0; } catch (ArrayIndexOutOfBoundsException e) { System.out.println("excepción: " + e.getMessage()); e.printStackTrace(); } } public static void main(String[] args) { new Ejemplo().aux(); } } Salida: excepción: null java.lang.ArrayIndexOutOfBoundsException at Ejemplo.aux(Ejemplo.java:5) at Ejemplo.main(Ejemplo.java:13)

Departamento de Lenguajes y Ciencias de la

27

Definiendo nuestras propias excepciones

Un usuario puede definir sus propias excepciones.

class MiExcepción extends Exception { MiExcepción(int i) { super(Integer.toString(i)); } }

Y ahora puede lanzarse como las demás.

throw new MiExcepción(5); ...

28

Ejemplo: La excepción de división por

cero

class ExcepciónDeDivisiónPorCero extends Exception { ExcepciónDeDivisiónPorCero() { super(); }

ExcepciónDeDivisiónPorCero(String msg) { super(msg); } }

Departamento de Lenguajes y Ciencias de la

31

PilaEstática

package pilas; import java.util.*; public class PilaEstática implements Pila { protected int siguienteLibre; protected List elementos; public PilaEstática() { elementos = new ArrayList(); siguienteLibre = 0; } public void añadir(T elem) { elementos.add(siguienteLibre, elem); siguienteLibre++; } public boolean esVacía() { return siguienteLibre == 0; } public T cima() throws PilaException { if (esVacía()){ throw new PilaException(“Pila vacía"); } return elementos.get(siguienteLibre - 1); } public void eliminar() throws PilaException { if (esVacía()){ throw new PilaException("Pila vacía"); } siguienteLibre--; } }

32

import pilas.; import java.util.;

public class TestPilas { public static void main(String args []) { Pila p = new PilaEstática(); Random gna = new Random();

for (int i = 0; i < 5; i++) { p.añadir(gna.nextInt(100)); }

// supongamos que queremos borrar todos los números // menores que 80 y 90 de la cima de la pila

try { while (p.cima() < 80) { p.eliminar(); } } catch (PilaException e) { System.out.println ("Error: " + e.getMessage()); }

while (!p.esVacía() && p.cima() < 90) { p.eliminar(); } } }

TestPilas

Uso no recomendado

Departamento de Lenguajes y Ciencias de la

33

Reglas para tratar situaciones excepcionales

  • Preventiva :

 La comprobación es poco costosa y es probable que se produzca la

excepción.

 Ejemplo: el método cima() de PilaEstática.

  • Curativa :

 La comprobación es costosa y es raro que se produzca la excepción.

 Ejemplo:

public void actionPerformed(ActionEvent e) { String comando = e.getActionCommand(); if (comando.equals("NÚMERO INTRODUCIDO")) { String txt = aNumericTextField.getText(); try { ... int i = Integer.parseInt(txt); ... } catch (NumberFormatException nfe) { aMessageTextField.setText("Introduzca un entero"); } } else { ... } ...