Para poder capturar excepciones, emplearemos la estructura de captura de excepciones try
-catch
-finally
.
Básicamente, para capturar una excepción lo que haremos será declarar bloques de código donde es posible que ocurra una excepción. Esto lo haremos mediante un bloque try (intentar). Si ocurre una excepción dentro de estos bloques, se lanza una excepción. Estas excepciones lanzadas se pueden capturar por medio de bloques catch
. Será dentro de este tipo de bloques donde se hará el manejo de las excepciones.
Su sintaxis es:
try {
código que puede generar excepciones;
} catch (Tipo_excepcion_1 objeto_excepcion) {
Manejo de excepción de Tipo_excepcion_1;
} catch (Tipo_excepcion_2 objeto_excepcion) {
Manejo de excepción de Tipo_excepcion_2;
}
...
finally {
instrucciones que se ejecutan siempre
}
En esta estructura, la parte catch
puede repetirse tantas veces como excepciones diferentes se deseen capturar. La parte finally
es opcional y, si aparece, solo podrá hacerlo una sola vez.
Cada catch
maneja un tipo de excepción. Cuando se produce una excepción, se busca el catch
que posea el manejador de excepción adecuado, será el que utilice el mismo tipo de excepción que se ha producido. Esto puede causar problemas si no se tiene cuidado, ya que la clase Exception es la superclase de todas las demás. Por lo que si se produjo, por ejemplo, una excepción
de tipo AritmethicException
y el primer catch
captura el tipo genérico Exception, será ese catch
el que se ejecute y no los demás.
Por eso el último catch
debe ser el que capture excepciones genéricas y los primeros deben ser los más específicos. Lógicamente si vamos a tratar a todas las excepciones (sean del tipo que sean) igual, entonces basta con un solo catch
que capture objetos Exception.