Cuando usar Excepciones

Primero definamos "Manejo de Excepción" (Wikipedia):

El manejo de excepciones es una estructura de control de los lenguajes de programación diseñada para manejar condiciones anormales que pueden ser tratadas por el mismo programa que se desarrolla.

Dado el siguiente código:



retcode = OK;
if (socket.read(name) != OK) {
retcode = BAD_READ;
}
else {
processName(name);
if (socket.read(address) != OK) {
retcode = BAD_READ;
}
else {
processAddress(address);
if (socket.read(telNo) != OK) {
retcode = BAD_READ;
}
else {
// etc, etc...
}
}
}
return retcode;



Al usar excepciones:



retcode = OK;
try {
socket.read(name);
process(name);
socket.read(address);
processAddress(address);
socket.read(telNo);
// etc, etc...
}
catch (IOException e) {
retcode = BAD_READ;
Logger.log("Error reading individual: " + e.getMessage());
}
return retcode;



¿Qué es excepcional?

Uno de los problemas con las excepciones consiste en saber cuándo usarlas.
Las excepciones deben ser reservados para eventos inesperados.
Suponga que una excepción no detectada dará terminado su programa y te preguntas "¿El código correrá si quito los manejadores de excepciones?" Si la respuesta es "no", entonces tal vez está siendo utilizado en cinrcunstancia no excepcional.

Por ejemplo, si el código intenta abrir un archivo para leerlo y el archivo no existe, debería plantearse una excepción?
Nuestra respuesta es "depende". Si el archivo debería haber estado allí, entonces una excepción es justificada, Por otra parte, si usted no tienen idea de que si el archivo debe existir o no, entonces no parece excepcional si no lo encuentra y retorna un error apropiado.

Ejemplo:

El siguiente código abre el archivo / etc / passwd, que debe existir en sistemas Unix. Si falla, pasa a un FileNotFoundException.



public void open_passwd() throws FileNotFoundException {
// This may throw FileNotFoundException...
ipstream = new FileInputStream("/etc/passwd");
// ...
}



Sin embargo, el segundo caso puede implicar la apertura de un archivo especificado por el usuario en la línea de comandos. He aquí una excepción no está justificada, y el aspecto del código diferente:



public boolean open_user_file(String name)
throws FileNotFoundException {
File f = new File(name);
if (!f.exists()) return false;
ipstream = new FileInputStream(f);
return true;
}



Tenga en cuenta que la llamada FileInputStream todavía puede generar una excepción. Sin embargo, la excepción se genera únicamente en circunstancias verdaderamente excepcionales; simplemente tratando de abrir un archivo que no existe generará un retorno de error convencional.

Tip 34
Use Exceptions for Exceptional Problems

Fuente: The Pragmatic Programmer From Journeyman to Master

Comentarios

Jose Luis Manrique ha dicho que…
Desde que trabajo en .net (espero que sea temporal) me doy cuenta que las exceptions del tipo checked (heredadas de java.lang.Exception) no son tan necesarias pues como son casos excepcionales como dices deberían de pasar por todas las capas hasta que alguna capa "adecuada" las capture y las trate. El manejo de excepciones es mas complejo de lo que se plantea en el post, quizá para complementar podrías agregar al articulo el criterio que usas para trabajar con excepciones Checked y Unchecked.

Saludos,
4cuatros ha dicho que…
Te doy la razón.
Pero, como dice el Post "cuando usar". O sea va más al comportamiento de un programador que verlo técnicamente.

Si fuera un post de "Excepciones" en general. Sería un post algo grande: cuando un Assert, diferencias entre error excepción, tipos de excepción, sus usos, excepciones personalizadas, etc..

Voy a poner un link. "para más info" que permite bajar información de este tema que tengo en el taller de SCJP

Gracias por el comentario :)