¿Qué son las excepciones?
A veces, cuando llamamos a un método, puede que algo vaya mal dentro del método y no pueda devolvernos un resultado. Por ejemplo, puede que le pasemos parámetros al método que no le gustan, como algún null, algún valor fuera de rango, etc. Es posible que el método quiera acceder a un fichero o a una base de datos y tenga problemas porque no existe el fichero, no tiene permisos de lectura, no puede conectarse con la base de datos, etc.
Tradicionalmente estos métodos o funciones, en lenguajes como C, devolvían un valor que se reconocía como no válido. Podía ser un NULL o más habitualmente, un -1. Por ejemplo, la función open() de C intenta abrir un fichero. Si lo consigue, devuelve un entero que es el descriptor del fichero. Si no lo consigue, devuelve -1.
Esta opción no es la más elegante. Muchas veces no podemos devolver un valor para indicar error. Por ejemplo, a la función atoi() de C se le pasa una cadena de texto como "123" y devuelve el entero 123. Esta función no puede devolver -1 para indicar error, puesto que si le pasamos la cadena "-1", debería devolver justamente -1.
Por ello, los métodos en los lenguajes más modernos como C++ o Java, además de devolver un valor, pueden "lanzar una excepción". Por ejemplo, la clase Writer de java, en su método write(), se le pasan unos bytes para escribir en algún sitio, un fichero por ejemplo. Si hay algún error, "lanza una excepción" IOException, para indicar que ha habido algún error.
Capturar excepciones: try-catch
Para llamar a ese método, debemos "capturar" la excepción, poniendo el código en bloques try-catch, de esta manera
Writer w = ...;
byte [] unosBytes = ...;
try
{
unaLineaDeCodigo();
w.write (unosBytes);
otraLineaDeCodigo();
}
catch (IOExcepcion e)
{
System.err.println("Error al escribir: "+e.toString());
}
Cuando se ejecuta este código, primero se ejecuta unaLineaDeCodigo(), luego w.write(unosBytes) y si no hay problemas, se ejecuta otraLineaDeCodigo(). En caso de problemas con w.write(unosBytes), la ejecución salta automáticamente al bloque catch(), ejecutándose el System.err.println(). NO se ejecutaría otraLineaDeCodigo().
Si el código dentro del bloque try genera varios tipos de excepciones, podemos poner varios bloques catch, para capturar por separado cada tipo. Por ejemplo,
try
{
codigo();
masCodigo();
yMas();
}
catch (IOException e)
{
trataIOException(e);
}
catch (DataFormatException e2)
{
trataDataFormatException(e2);
}
catch (...)