Captura de una excepción

La cláusula de captura (catch) constituye el manejador de excepciones. Cuando una excepción se lanza desde alguna sentencia de un bloque try, se pone en marcha el mecanismo de captura. La excepción será capturada por un catch de la lista de cláusulas catch que siguen al bloque try. 

Una cláusula catch consta de tres puntos: la palabra reservada catch, la declaración de un único argumento que ha de ser un objeto para manejo de excepciones (declaración de excepciones), y un bloque de sentencias. Si la cláusula catch se selecciona para manejar una excepción, se ejecuta el bloque de sentencias.

Sintaxis

       catch(argumento)             // captura excepción del tipo del argumento
       {
                   código del bloque catch
       }

La especificación del manejador catch se asemeja a la definición de un método.

Al contrario que el bloque try, el bloque catch solo se ejecuta bajo circunstancias especiales. El argumento es la excepción que puede ser capturada, una referencia a un objeto de una clase ya definida, o bien derivada de la clase base Exception. Al igual que con los métodos sobrecargados, el manejador de excepciones se activa solo si el argumento que se pasa ( o se lanza, «thrown») se corresponde con la declaración del argumento. Hay que tener en cuenta que hay una correspondencia automática entre clase derivada y clase base.

       catch(Excepcion1 e1) {. . .}
       catch(Excepcion2 e2) {. . .}
       . . .
       catch(Exception e) {. . .}

El último catch significa «cualquier excepción» ya que Exception es la superclase base de la jerarquía de clases que tratan las anomalías. Se puede utilizar como manejador de excepciones de manera predeterminada ya que captura cualquier excepción. La sintaxis completa de try y catch permite escribir cualquier número de manejadores de excepciones al mismo nivel.

       try{
                  sentencias
       }
       catch(parámetro1){
                  sentencias
       }
       catch(parámetro2){
                  sentencias
       }
       . . .

Los puntos suspensivos (. . .) significa que puede tener cualquier número de bloques catch a continuación del bloque try.

Precaución

La clase base de la cual derivan las excepciones es Exception. Por ello el manejador catch (Exception e) captura cualquier excepción lanzada. De utilizarse debe situarse el último en el bloque try-catch.

Funcionamiento

Cuando ocurre una excepción en una sentencia durante la ejecución del bloque try, el programa comprueba, por orden, cada bloque catch hasta que encuentra un manejador (catch) cuyo argumento coincide con el tipo de excepción. Tan pronto como se encuentra una coincidencia, se ejecutan las sentencias del bloque catch; cuando se han ejecutado las sentencias del manejador, se termina el bloque try y prosigue la ejecución con la siguiente sentencia. Es decir, si el método no ha terminado, la ejecución se reanuda después del final de todos los bloques catch. Si no existen manejadores para tratar con una excepción, esta se relanza para ser tratada en el bloque try del método llamador anterior. Si no ocurre ninguna excepción, las sentencias se ejecutan de modo normal y ninguno de los manejadores será invocado.

Ejemplo

Se escriben diversos catch para un bloque try. Las clases que aparecen están declaradas en los diversos paquetes de Java, o bien son clases definidas por el usuario.

       try{
                  // sentencias, llamadas a métodos
       }
       catch(IOException ent){
                  System.out.println(«Entrada incorrecta desde el teclado»);
                  throw ent;
       }
       catch(SuperaException at){
                  System.out.println(«Valor supera máximo permitido»);
                  return ;
       }
       catch(ArithmeticException a){
                  System.out.println(«Error aritmético, división por cero. . .»);
       }
       catch(Exception et){
                  System.out.println(«Cualquier otra excepción»);
                  throw et;
       }