Buen manejo de excepciones en Java

Es una mala práctica de los programadores (obviamente empiezo por mi) no escribir un código que maneje las excepciones correctamente, es por eso que quiero hacer mi humilde aporte que yo estoy implementando para obtener un código mas limpio y que depues otra persona lo pueda editar sin morir en el intento.

La estructura básica que deberia tener todo método (siempre y cuando no lanc e la excepcion con throw) es la siguiente:

public static void main(String[] args) {
		 try {
			// Código  que puede dar una excepción.
		    }
			catch (IOException  e) {
			// Capturamos la excepción del tipo Entrada/Salida,
                        // o la que nosotros creamos que es mas probable.
		    }
			catch (Exception e) {
			// Capturamos cualquier otra excepción.
			}
			finally {
		    // Código que se ejecuta con o sin excepción.
		    }
}

Hay que considerar que las excepciones que lanza Java son una clase que contiene sus metodos, esto nos ayuda mucho para identificar el error y tratarlo de la forma que queramos.

El siguiente ejemplo lanza un excepción (a proposito) del tiepo Entrada/Salida (IOException) al intentar leer un archivo de texto inexistente.

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class ManejoDeExcepciones {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// Creamos un archivo inexistente.
		File f = new File("C:archivoInexistente.txt");
		BufferedReader entrada = null;
		try {
			// Intentamos leerlo.
			entrada = new BufferedReader(new FileReader(f));

		} catch (IOException e) {
			// Capturamos la excepción que sabemos que puede ocurrir.
			System.err.println("Ouch! IOException: " + e.toString());
		} catch (Exception e) {
			// Capturamos otra excepción, una nunca sabe :)
			System.err.println("Ouch! Error Desconocido: " + e.getMessage());
		}

		finally {
			System.out.println("Fin de la aplicación!");
		}

	}

}

Esto sirve mucho cuando tenemos que hacer consultas a base de datos, la excepción que lanza cuando tenemos problemas es la SQLException, que contiene un metodo getErrorCode() que nos devuelve un int con  el código de error, dependiendo del motor de base de datos, podemos saber de que se trata el error y devolver un mensaje entendible para el usuario (por ejemplo cuando una tabla no existe o se quiere eliminar una  clave foranea). Por ejemplo,  aquí puedes ver todos los código de error del motor de base de datos Oracle.