Está en la página 1de 19

Lenguaje Java

Características Avanzadas
Manejo de Excepciones

Profesor: Andrés Guzmán F.


Manejo de Errores
Introducción

 Existe una regla de oro en el mundo de la programación: en los


programas ocurren errores.
 Esto es sabido. Pero ¿qué sucede realmente después de que ha
ocurrido el error? ¿Cómo se maneja el error? ¿Quién lo maneja?,
¿Puede recuperarlo el programa?
 El lenguaje Java utiliza excepciones para proporcionar capacidades de
manejo de errores.
 En esta lección aprenderemos qué es una excepción, cómo lanzar y
capturar excepciones, qué hacer con una excepción una vez
capturada, y cómo hacer un mejor uso de las excepciones heredadas
de las clases proporcionadas por el entorno de desarrollo de Java.
 Una excepción es un evento que ocurre durante la ejecución del
programa que interrumpe el flujo normal de las sentencias
Manejo de Errores
Separar el Manejo de
Errores del Código "Normal"
 En la programación tradicional, la detección, el informe y el manejo de
errores se convierte en un código muy liado.
 Por ejemplo, supongamos que tenemos una función que lee un fichero
completo dentro de la memoria. En pseudocódigo, la función se podría
parecer a esto:

leerFichero {
abrir el fichero;
determinar su tamaño;
asignar suficiente memoria;
volcar el fichero a la memoria;
cerrar el fichero;
}
Manejo de Errores
Separar el Manejo de
Errores del Código "Normal"
 A primera vista esta función parece bastante sencilla, pero ignora
todos aquellos errores potenciales.
 ¿Qué sucede si no se puede abrir el fichero?
 ¿Qué sucede si no se puede determinar la longitud del fichero?
 ¿Qué sucede si no hay suficiente memoria libre?
 ¿Qué sucede si la lectura o volcado a memoria falla?
 ¿Qué sucede si no se puede cerrar el fichero?
 Para responder a estas cuestiones dentro de la función, tendríamos
que añadir mucho código para la detección y el manejo de errores.
Manejo de Errores
Separar el Manejo de
Errores del Código "Normal"
 El aspecto final de la función se parecería esto.
Manejo de Errores
Separar el Manejo de
Errores del Código "Normal"
 Con la detección de errores, las 7 líneas originales (en negrita) se han
convertido en 29 líneas de código-- a aumentado casi un 400 %.
 Lo peor, existe tanta detección y manejo de errores y de retorno que
en las 7 líneas originales y el código está totalmente atestado.
 Y aún peor, el flujo lógico del código también se pierde, haciendo difícil
poder decir si el código hace lo correcto (si ¿se cierra el fichero
realmente si falla la asignación de memoria?)
 Incluso es difícil asegurar que el código continúe haciendo las cosas
correctas cuando se modifique la función tres meses después de
haberla escrito.
Manejo de Errores
Separar el Manejo de
Errores del Código "Normal"
 Java proporciona una solución elegante al problema del tratamiento de
errores: las excepciones.
 Las excepciones le permiten escribir el flujo principal de su código y
tratar los casos excepcionales en otro lugar.
 Si la función leerFcihero utilizara excepciones en lugar de las técnicas
de manejo de errores tradicionales se podría parecer a esto.
Manejo de Errores
Separar el Manejo de
Errores del Código "Normal"
 Observa que las excepciones no evitan el esfuerzo de hacer el trabajo
de detectar, informar y manejar errores. Lo que proporcionan las
excepciones es la posibilidad de separar los detalles oscuros de qué
hacer cuando ocurre algo fuera de la normal.
 Además, el factor de aumento de código de este es programa es de un
250% -- comparado con el 400% del ejemplo anterior.
Manejo de Errores
Usando Excepciones Java

 Las excepciones son la manera que ofrece Java de manejar los


errores en tiempo de ejecución.
 Muchos lenguajes imperativos, cuando tenían un error de este clase lo
que hacían era detener la ejecución del programa.
 Las excepciones nos permiten escribir código que nos permita manejar
ese error y continuar (si lo estimamos conveniente) con la ejecución
del programa.
 Muchas clases de errores pueden utilizar excepciones -- desde serios
problemas de hardware, como la avería de un disco duro, a los
simples errores de programación, como tratar de acceder a un
elemento de un array fuera de sus límites.
 El error en ejecución más clásico en Java es el de desbordamiento. Es
decir, el intento de acceso a una posición de un vector que no existe.
Por ejemplo:
Manejo de Errores
Usando Excepciones Java

 Imprime y lanaza la exepción java.lang.ArrayIndexOutOfBoundsException:

 Nos da un error de ejecución (en esta terminología se diría que se lanzó una
excepción) al intentar acceder a un valor inexistente, fuera del limite de
índice.
 Vemos que, por ahora, el comportamiento de nuestro código es el mismo
que en los lenguajes imperativos. Cuando encuentra el error, se para la
ejecución.
 Ahora veremos como evitar esto.
Manejo de Errores
try...catch...finally
 Existe una estructura que nos permitirá capturar excepciones, es decir,
reaccionar a un error de ejecución.
 De este modo podremos imprimir mensajes de error "a la medida" y
continuar con la ejecución del programa si consideramos que el error
no es demasiado grave.
 Para ver como funcionan vamos a modificar el ejemplo anterior, pero
asegurándonos ahora de que capturamos las excepciones
Manejo de Errores
try...catch...finally
 El Bloque try: El primer paso en la escritura de una manejador de
excepciones es poner la sentencia Java dentro de la cual se puede
producir la excepción dentro de un bloque try. Se dice que el bloque try
gobierna las sentencias encerradas dentro de él y define el ámbito de
cualquier manejador de excepciones (establecido por el bloque catch
subsecuente) asociado con él.
 Los bloques catch: Después se debe asociar un manejador de
excepciones con un bloque try proporcionándole uno o más bloques
catch directamente después del bloque try.
 El bloque finally: El bloque finally de Java proporciona un mecanismo
que permite a sus métodos limpiarse a si mismos sin importar lo que
sucede dentro del bloque try. Se utiliza el bloque finally para cerrar
ficheros o liberar otros recursos del sistema.
Manejo de Errores
try...catch...finally

 Dentro del bloque que sigue a try colocamos el código a ejecutar. Es


como si dijéramos que vamos a intentar ejecutar dicho código a ver
qué pasa.
 Después de try deberemos colocar al menos un bloque catch o un
bloque finally, pudiendo tener ambos e incluso más de un bloque catch
anidado.
Manejo de Errores
Clase Exception
 Cuando se lanza una excepción, en nuestro mundo orientado objetos lo que se
hace es lanzar una instancia de Exception o de una clase derivada de él.
 Normalmente las clases derivadas no añaden mucha funcionalidad (muchas
veces ninguna en absoluto), pero al ser distintas nos permiten distinguir entre los
distintos tipos de excepciones.
 En el programa anterior, por ejemplo, en el bloque catch capturábamos una
excepción del tipo ArrayIndexOutOfBoundsException, ignorando cualquier otro
tipo de excepción.
 Esta clase tiene como cositas interesantes dos constructores y dos métodos
(tiene más métodos pero sólo vamos a ver éstos):
 Exception e = new Exception() Crea una excepción si ningún mensaje
específico. Exception e = new Exception ( String ) Crea una excepción con un
mensaje que detalla el tipo de excepción.
 String e.getMessage() Devuelve el mensaje detallado si existe o null en caso
contrario.
 void e.printStackTrace() Escribe por la salida de error estándar una traza que
nos permitirá localizar donde se generó el error. Es muy útil para depurar, pero
no es conveniente que lo usuarios finales vean estas cosas.
Manejo de Errores
Capturar excepciones
 Ahora sabemos lo suficiente como para entender cómo funcionan los catch.
 Entre paréntesis, cual parámetro se pone la declaración de una excepción, es decir, el
nombre de una clase derivada de Exception (o la misma Exception) seguido por el nombre
de la variable.
 Si se lanza una excepción que es la que deseamos capturar o una derivada de la misma se
ejecutará el código que contiene el bloque. Así, por ejemplo:

 Se ejecutará siempre que se produzca una excepción del tipo que sea, ya que todas las
excepciones se derivan de Exception.
 No es recomendable utilizar algo así ya que estamos capturando cualquier tipo de
excepciones.
 Se pueden colocar varios bloques catch. En ese caso, se comprobará en orden si la
excepción lanzada es la que deseamos capturar y si no pasa a comprobar la siguiente.
 Eso sí, sólo se ejecuta un bloque catch. En cuanto captura la excepción deja de comprobar
los demás bloques.
Manejo de Errores
Capturar excepciones
Manejo de Errores
La Sentencias throw
 Todos los métodos Java utilizan la sentencia throw para lanzar una excepción
 Esta sentencia requiere un sólo argumento, un objeto Throwable.
 En el sistema Java, los objetos lanzables son ejemplares de la clase Throwable
definida en el paquete java.lang
 Aquí tenemos un ejemplo de la sentencia throw: throw algunObjetoThrowable;

 En el ejemplo comprueba si el archivo no está vacio. Si es nombre de archivo es


vacio, ejemplariza un nuevo objeto de la clase MiFileException y lo lanza. Esta
clase está definida por nosotros, aunque podemos haber utilizado una definida
en las librerías de java.
 En páginas posteriores podrás ver cómo crear tus propias clases de
excepciones. Por ahora, todo lo que necesitas recordar es que se pueden lanzar
objetos heredados desde la clase Throwable.
Manejo de Errores
La Clausula throws
 Habrás observado que la declaración del método main() del ejemplo anterior
que contiene esta clausula: throws MiFileException
 La clausula throws especifica que el método puede lanzar una excepción
MiFileException. Como ya sabes, el lenguaje Java requiere que los métodos
capturen o especifiquen todas las excepciones chequeadas que puedan ser
lanzadas dentro de su ámbito
 Se puede hacer esto con la clausula throws de la declaración del método.
Manejo de Errores
Crear Clases de Excepciones
 Tratándose de la elección del tipo de excepción a lanzar, tenemos dos opciones
 Utilizar una escrita por otra persona o de las librerías de java. Por ejemplo, el
entorno de desarrollo de Java proporciona muchas clases de excepciones que
podríamos utilizar
 Escribirlas uno mismo, ejemplo:

También podría gustarte