Tratamiento de excepciones¶
Un programa que trate las excepciones debe realizar los siguientes pasos:
- Se intenta (
try) ejecutar un bloque de código. - Si se produce una circunstancia excepcional se lanza (
throw) una excepción. En caso contrario el programa sigue su curso normal. - Si se ha lanzado una excepción, la ejecución del programa es desviada al manejador de excepciones donde la excepción se captura (
catch) y se decide qué hacer al respecto.
try{
//Instrucciones que se intentan ejecutar, si se produce una
//situación inesperada se lanza una excepción
} catch(tipoExcepcion e){
//Instrucciones para tratar esta excepción
} catch(otroTipoExcepcion e){
//Instrucciones para tratar esta excepción
}
//Se pueden escribir tantos bloques catch como sean necesarios
finally{
//instrucciones que se ejecutarán siempre después de un bloque try,
//se haya producido o no una excepción
}
Bloque try¶
- En el bloque
tryse encuentran las instrucciones que pueden lanzar una excepción. - Solamente se pueden capturar las excepciones lanzadas dentro del bloque
try. - Una excepción se puede lanzar de forma automática o mediante la palabra reservada
throw. - Cuando se lanza la excepción se transfiere la ejecución del programa desde el punto donde se lanza la excepción a otro punto donde se captura.
Bloque catch¶
- Es el bloque de código donde se captura la excepción.
- El bloque
catches el manejador o handler de la excepción. - Aquí se decide qué hacer con la excepción capturada.
- Puede haber varios bloques catch relacionados con un bloque
try. - Una vez finalizado un bloque
catchla ejecución no vuelve al punto donde se lanzó la excepción, sino que continúa por la primera instrucción a continuación de los bloquescatch.
Bloque finally¶
- Es un bloque opcional y debe aparecer a continuación de los bloques
catch. - También puede aparecer a continuación de un bloque
trysi no hay bloquescatch. -
La ejecución de sus instrucciones queda garantizada independientemente de que el bloque
tryacabe o no su ejecución, incluso en los siguientes casos:- Aunque el bloque
trytenga una sentenciareturn,continueobreak, se ejecutará el bloquefinally. - Cuando se haya lanzado una excepción que ha sido capturada por un bloque
catch. Elfinallyse ejecuta después delcatchcorrespondiente. - Si se ha lanzado una excepción que no ha sido capturada, se ejecuta
finallyantes de acabar el programa.
- Aunque el bloque
-
Un bloque
finallyse usa para dejar un estado consistente después de ejecutar el bloquetry. - Un ejemplo de uso de bloques
finallypuede ser cuando estamos tratando con ficheros y se produce una excepción. Podemos escribir un bloquefinallypara cerrar el fichero. Este bloque se ejecutará siempre y se liberarán los recursos ocupados por el fichero.
/*El siguiente programa lee un número entero y lo muestra. Si en la instrucción sc.nextInt()
se introduce un número de otro tipo o un carácter, se lanza una excepción InputMismatchException
que es capturada por el bloque catch.
En este bloque se realizan las instrucciones necesarias para
resolver la situación y que el programa pueda continuar.*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n;
do{
try{
System.out.print("Introduce un número entero > 0: ");
n = sc.nextInt();
System.out.println("Num. introducido: " + n);
} catch(InputMismatchException e){
sc.nextLine(); //retorna la tecla enter
n = 0;
System.out.println("Introduzca un entero " + e.toString());
}
}while(n<=0);
}
Captura de excepciones¶
Un bloque try puede estar seguido de varios bloques catch, tantos como excepciones diferentes queramos manejar.
La estructura y el comportamiento de un bloque catch son similares al de un método. La excepción es capturada por el bloque catch cuyo argumento coincida con el tipo de objeto lanzado.
La búsqueda de coincidencia se realiza sucesivamente sobre los bloques catch en el orden en que aparecen en el código hasta que aparece la primera concordancia.
Cuando acaba la ejecución de este bloque, el programa continúa después del último de los catch que sigan al bloque try que lanzó la excepción.
Cuidado con las anidaciones
El sistema de control de excepciones puede ser anidado a cualquier nivel. Debe mantenerse la regla de que un bloque try debe ser seguido por un catch. Pueden existir secuencias try-catch dentro de bloques try y de bloques catch.
Cada catch debe tener como parámetro un objeto de la clase Throwable, de una clase derivada de ella o de una clase definida por el programador.
Cuando se lanza una excepción se captura por el primer bloque catch cuyo parámetro sea de la misma clase que el objeto excepción o de una clase base directa o indirecta. Por este motivo, es importante el orden en que se coloquen los bloques catch.
Las excepciones más genéricas se deben capturar al final. Si no es necesario tratar excepciones concretas de forma específica se puede poner un bloque catch de una clase base que las capture todas y las trate de forma general. Esto se conoce como captura genérica de excepciones.
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int [] array = {4,2,6,7};
int n;
boolean repetir = false;
do{
try{
repetir = false;
System.out.print("Un entero > 0 y < " + array.length + " ");
n = sc.nextInt();
System.out.println("Valor en la posición " + n + ": " + array[n]);
} catch(InputMismatchException e){
sc.nextLine();
n = 0;
System.out.println("Debe introducir un entero ");
repetir = true;
} catch(IndexOutOfBoundsException e){
System.out.println("Un entero > 0 y < " + array.length + " ");
repetir = true;
} catch(Exception e){
// resto de excepciones de tipo Exception
// y derivadas
System.out.println("Error inesperado " + e.toString());
repetir = true;
}
}while(repetir);
}