Excepciones en Java
Si algo puede ir mal en un programa, podemos apostar a que irá mal. Ley fundamental de Murphy.
Los errores ocurren, los bugs son inevitables, somos humanos y cometemos errores al programar. Por eso es importante utilizar correctamente las excepciones en Java, aquí les paso algunos puntos importantes:
Utilizar excepciones solo para condiciones excepcionales
Este problema afecta seriamente la claridad del código. Cuando se utilizan las excepciones para realizar el control de flujo de un método se hace realmente difícil de leer, además de traer una sobrecarga a la JVM ya que ejecutar un bloque catch es mucho más costoso que un bloque else. Las excepciones deben utilizarse justamente para lo que son: condiciones excepcionales.
Utilizar checked exceptions de forma innecesaria
Este error es muy frecuente, principalmente se debe a que se desconoce la diferencia entre checked exceptions y unchecked exceptions en Java. Checked exceptions son las excepciones que heredan de java.lang.Exception, las unchecked exceptions son las que heredan de java.lang.RuntimeException. La diferencia está en que para las checked el compilador de Java te obliga a tratar la excepción en un bloque catch o bien declarar la excepción en el throws para obligar al método que invoca a tratar la excepción. Para las unchecked exceptions esto no es obligatorio.
Las checked exceptions deben utilizarse solo cuando la excepción es recuperable y se puede realizar algo al respecto (en un bloque catch). Un error común es atrapar checked exceptions para solamente hacerle throws en un bloque catch, esto únicamente trae una sobrecarga a la JVM ya que conservar los traces sucesivos de la excepciones es costoso, además que inunda nuestro código de try's, catch's y throws que no hacen nada.
En conclusión, si no se puede hacer nada con una excepción que sea unchecked exception y dejen que se propague. Si se puede hacer algo para recuperarse de la excepción que se checked exception para que el que invoca pueda tratar la excepción. Aquí es importante también agregar información relevante a la excepción para que pueda ser tratada.
Favorecer el uso de las excepciones estándar de Java
Antes de ponerse a crear unchecked exceptions denle una revisada a las excepciones estándar que ofrece Java: IllegalArgumentException, IllegalStateException, NullPointerException, IndexOutOfBoundsException, ConcurrentModificationException, UnsupportedOperationException, etc
No ignorar las excepciones
Un bloque catch vacío es como una mina antipersonal para una aplicación, si alguién tuvo la mala suerte de pasar por ahi, explotará y nadie sabrá que paso. La mina será más grande mientras más general sea la excepción que se está atrapando, por ejemplo un bloque catch vacío que atrapa java.lang.Exception (muy común), se estaría "comiendo" cualquier java.lang.RuntimeException (ya que heredan de java.lang.Exception), y como el bloque está vacío se evita que se propaguen las excepciones y nadie se entera que pasó realmente.

