Manejo de Errores Usando Excepciones Java

El paso final en la creaci�n de un manejador de excepci�n es proporcionar un mecanismo que limpie el estado del m�todo antes (posiblemente) de permitir que el control pase a otra parte diferente del programa. Se puede hacer esto encerrando el c�digo de limpieza dentro de un bloque finally.

El bloque try del m�todo writeList() ha estado trabajando con un PrintStream abierto. El programa deber�a cerrar ese canal antes de pemitir que el control salga del m�todo writeList(). Esto plantea un problema complicado, ya que el bloque try del writeList() tiene tres posibles salidas.

  1. La sentencia new FileOutputStream falla y lanza una IOException.
  2. La sentencia victor.elementAt(i) falla y lanza una ArrayIndexOutOfBoundsException.
  3. Todo tiene �xito y el bloque try sale normalmente.

El sistema de ejecuci�n siempre ejecuta las sentencias que hay dentro del bloque finally sin importar lo que suceda dentro del bloque try. Esto es, sin importar la forma de salida del bloque try del m�todo writeList() debido a los escenarios 1, 2 � 3 listados arriba, el c�digo que hay dentro del bloque finally ser� ejecutado de todas formas.

Este es el bloque finally para el m�todo writeList(). Limpia y cierra el canal PrintStream.

finally {
    if (pStr != null) { 
        System.out.println("Closing PrintStream");
        pStr.close(); 
    } else { 
        System.out.println("PrintStream not open");
    } 
}
 

.��Es realmente necesaria la sentencia finally?

La primera necesidad de la sentencia finally podr�a no aparecer de forma inmediata. Los programadores se preguntan frecuentemente "�Es realmente necesaria la sentencia finally o es s�lo azucar para mi Java?" En particular los programadores de C++ dudan de la necesidad de esta sentencia porque C++ no la tiene.

Esta necesidad de la sentencia finally no aparece hasta que se considera lo siguiente: �c�mo se pordr�a cerrar el PrintStream en el m�todo writeList() si no se proporcionara un manejador de excepci�n para la ArrayIndexOutOfBoundsException y ocurre una ArrayIndexOutOfBoundsException? (ser�a sencillo y legal omitir un manejador de excepci�n para ArrayIndexOutOfBoundsException porque es una excepci�n en tiempo de ejecuci�n y el compilador no alerta de que writeList() contiene una llamada a un m�todo que puede lanzar una).

La respuesta es que el PrintStream no se cerrar�a si ocurriera una excepci�n ArrayIndexOutOfBoundsException y writeList() no proporcionara u manejador para ella -- a menos que writeList() proporcionara una sentencia finally.

Existen otros beneficios de la utilizaci�n de la sentencia finally. En el ejemplo de writeList() es posible proporcionar un c�digo de limpieza sin la intervenci�n de una sentencia finally. Por ejemplo, podr�amos poner el c�digo para cerrar el PrintStream al final del bloque try y de nuevo dentro del manejador de excepci�n para ArrayIndexOutOfBoundsException, como se muestra aqu�.

try {
    . . .
    pStr.close();       // No haga esto, duplica el c�digo 
} catch (ArrayIndexOutOfBoundsException e) {
    pStr.close();       // No haga esto, duplica el c�digo 
    System.err.println("Caught ArrayIndexOutOfBoundsException: " + e.getMessage());
} catch (IOException e) {
    System.err.println("Caught IOException: " + e.getMessage());
}

Sin embargo, esto duplica el c�digo, haci�ndolo d�ficil de leer y propenso a errores si se modifica m�s tarde, Por ejemplo, si se a�ade c�digo al bloque try que pudiera lanzar otro tipo de excepci�n, se tendr�a que recordar el cerrar el PrintStream dentro del nuevo manejador de excepci�n (lo que se olvidar� seguro si se parece a m�).

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO