Manejo de Errores Usando Excepciones Java

Como se aprendi� en la p�gina anterior, la sentencia try define el �mbito de sus manejadores de excepci�n asociados. Se pueden asociar manejadores de excepci�n a una sentencia try proporcionando uno o m�s bloques catch directamente despu�s del bloque try.

try {
    . . .
} catch ( . . . ) {
    . . .
} catch ( . . . ) {
    . . .
} . . . 

No puede haber ning�n c�digo entre el final de la sentencia try y el principio de la primera sentencia catch. La forma general de una sentencia catch en Java es esta.

catch (AlgunObjetoThrowable nombreVariable) {
    Sentencias Java
}

Como puedes ver, la sentencia catch requiere un s�lo argumento formal. Este argumento parece un argumento de una declaraci�n de m�todo. El tipo del argumento AlgunObjetoThrowable declara el tipo de excepci�n que el manejador puede manejar y debe ser el nombre de una clase heredada de la clase Throwable definida en el paquete java.lang. (Cuando los programas Java lanzan una excepci�n realmente est�n lanzado un objeto, s�lo pueden lanzarse los objetos derivados de la clase Throwable. Aprender�s c�mo lanzar excepciones en la lecci�n �C�mo Lanzar Excepciones?.)

nombreVariable es el nombre por el que el manejador puede referirse a la excepci�n capturada. Por ejemplo, los manejadores de excepciones para el m�todo writeList() (mostrados m�s adelante) llaman al m�todo getMessage() de la excepci�n utilizando el nombre de excepci�n declarado e.

e.getMessage()

Se puede acceder a las variables y m�todos de las excepciones en la misma forma que accede a los de cualquier otro objeto. getMessage() es un m�todo proporcionado por la clase Throwable que imprime informaci�n adicional sobre el error ocurrido. La clase Throwable tambi�n implementa dos m�todos para rellenar e imprimir el contenido de la pila de ejecuci�n cuando ocurre la excepci�n. Las subclases de Throwable pueden a�adir otros m�todos o variables de ejemplar, Para buscar qu� metodos implementar en una excpeci�n, se puede comprobar la definici�n de la clase y las definiciones de las clases antecesoras.

El bloque catch contiene una serie de sentencias Java legales. Estas sentencias se ejecutan cuando se llama al manejador de excepci�n. El sistema de ejecuci�n llama al manejador de excepci�n cuando el manejador es el primero en la pila de llamadas cuyo tipo coincide con el de la excepci�n lanzada.

El m�todo writeList() de la clase de ejemplo ListOfNumbers utiliza dos manejadores de excepci�n para su sentencia try, con un manejador para cada uno de los tipos de excepciones que pueden lanzarse dentro del bloque try -- ArrayIndexOutOfBoundsException y IOException.

try {
    . . .
} catch (ArrayIndexOutOfBoundsException e) {
    System.err.println("Caught ArrayIndexOutOfBoundsException: " + e.getMessage());
} catch (IOException e) {
    System.err.println("Caught IOException: " + e.getMessage());
}

.�Ocurre una IOException

Supongamos que ocurre una excepci�n IOException dentro del bloque try. El sistema de ejecuci�n inmediantamente toma posesi�n e intenta localizar el manejador de excepci�n adecuado. El sistema de ejecuci�n empieza buscando al principio de la pila de llamadas. Sin embargo, el constructor de FileOutputStream no tiene un manejador de excepci�n apropiado por eso el sistema de ejecuci�n comprueba el siguiente m�todo en la pila de llamadas -- el m�todo writeList(). Este m�todo tiene dos manejadores de excepciones: uno para ArrayIndexOutOfBoundsException y otro para IOException.

El sistema de ejecuci�n comprueba los manejadores de writeList() por el orden en el que aparecen despu�s del bloque try. El primer manejador de excepci�n cuyo argumento corresponda con el de la excepci�n lanzada es el elegido por el sistema de ejecuci�n. (El orden de los manejadores de excepci�n es importante!) El argumento del primer manejador es una ArrayIndexOutOfBoundsException, pero la excepci�n que se ha lanzado era una IOException. Una excepci�n IOException no puede asignarse legalmente a una ArrayIndexOutOfBoundsException, por eso el sistema de ejecuci�n contin�a la b�squeda de un manejador de excepci�n apropiado.

El argumento del segundo manejador de excepci�n de writeList() es una IOException. La excepci�n lanzada por el constructor de FileOutputStream tambi�n es un una IOException y por eso puede ser asignada al argumento del manejador de excepciones de IOException. As�, este manejador parece el apropiado y el sistema de ejecuci�n ejecuta el manejador, el cual imprime esta sentencia.

Caught IOException: OutFile.txt

El sistema de ejecuci�n sigue un proceso similar si ocurre una excepci�n ArrayIndexOutOfBoundsException. Para m�s detalles puedes ver.

Poni�ndolo todo Junto que te lleva a trav�s de m�todo writeList() despu�s de haberlo completado (queda un paso m�s) e investiga lo que sucede en varios escenarios.

.�Capturar Varios Tipos de Excepciones con Un Manejador

Los dos manejadores de excepci�n utilizados por el m�todo writeList() son muy especializados. Cada uno s�lo maneja un tipo de excepci�n. El lenguaje Java permite escribir manejadores de excepciones generales que pueden manejar varios tipos de excepciones.

Como ya sabes, las excepciones Java son objetos de la clase Throwable (son ejemplares de la clase Throwable a de alguna de sus subclases). Los paquetes Java contienen numerosas clases derivadas de la clase Throwable y as� construyen un �rbol de clases Throwable.

El manejador de excepci�n puede ser escrito para manejar cualquier calse heredada de Throwable. Si se escribe un manejador para una clase 'hoja? (una clase que no tiene subclases), se habr� escrito un manejador especializado: s�lo maneja excepciones de un tipo espec�fico. Si se escribe un manejador para una clase 'nodo' (una clase que tiene subclases), se habr� escrito un manejador general: se podr� manejar cualquier excepci�n cuyo tipo sea el de la clase nodo o de cualquiera de sus subclases.

M�difiquemos de nuevo el m�todo writeList(). S�lo esta vez, escribamoslo para que maneje las dos excepciones IOExceptions y ArrayIndexOutOfBoundsExceptions. El antecesor m�s cercano de estas dos excepciones es la clase Exception. As� un manejador de excepci�n que quisiera manejar los dos tipos se parecer�a a esto.

try {
    . . .
} catch (Exception e) {
    System.err.println("Exception caught: " + e.getMessage());
}

La clase Exception est� bastante arriba en el �rbol de herencias de la clase Throwable. Por eso, adem�s de capturar los tipos de IOException y ArrayIndexOutOfBoundsException este manejador de excepciones, puede capturar otros muchos tipos. Generalmente hablando, los manejadores de excepci�n deben ser m�s especializados.

Los manejadores que pueden capturar la mayor�a o todas las excepciones son menos utilizados para la recuperac�n de errores porque el menejador tiene que determinar qu� tipo de excepci�n ha ocurrido de todas formas (para determinar la mejor estrategia de recuperaci�n). Los manejadores de excepciones que son demasiado generales pueden hacer el c�digo m�s propenso a errores mediante la captura y menejo de excepciones que no fueron anticipadas por el programador y para las que el manejador no est� dise�ado.

COMPARTE ESTE ARTÍCULO

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

SIGUIENTE ARTÍCULO