<$BlogRSDUrl$>

Esos aparatos del demonio

Mis notas sobre lo que voy leyendo de ordenadores y periféricos

miércoles, diciembre 28, 2005

¿Qué es una excepción? 


No me convence mucho lo que hablan aquí de cómo evitar el abuso de las excepciones en Java (el enlace probablemente se autodestruirá en menos de una semana). El primer ejemplo que pone es este código:


try {
chargeCustomerCard(variable1, variable2);
updateDatabaseWithSuccessfulCharge(variable1, variable2);
} catch (CreditCardException e) {
logCreditCardException(variable1, variable2);
} catch (Exception e) {
updateDatabaseWithFailedCharge(variable1, variable2);
}


Dicen que es código malo y que sería mejor utilizar una variable de retorno en la función chargeCustomerCard para indicar cuándo no se puede hacer el cargo; es decir, algo así:


try {
if (chargeCustomerCard(variable1, variable2)) {
updateDatabaseWithSuccessfulCharge(variable1, variable2);
} else {
updateDatabaseWithFailedCharge(variable1, variable2);
}
} catch (CreditCardException e) {
logCreditCardException(variable1, variable2);
}


A mí no me convence, y a mucha gente en OSNews tampoco. No me convence porque me parece volver al viejo sistema de toda la vida y mezclar los valores de retorno para indicar errores con el tratamiento de excepciones. Como dice alguien por ahí, todo el que no conoce errno está condenado a reinventarla.

El argumento que dan en el enlace es que las excepciones sólo son para casos excepcionales y que no se pueda hacer un cargo en una tarjeta no es un caso excepcional, además de que con excepciones se genera un código menos legible y, si no se capturan, pueden acabar explotando más arriba. ¿Vosotros que opináis?

Comentarios:

Bueno... yo estoy con el argumento del artículo: Las excepciones deberían ser para los casos excepcionales y no para marcar el flujo del programa.

Las excepciones se deberían usar (en mi opinión) cuando un objeto no es usable o consistente y la siguiente sentencia no va a tener sentido (Por ejemplo, cuando falla un constructor)

De todos modos elegir condicionales y/o excepciones me parece una de esas cosas en la que la ciencia de programar se convierte en arte. No se puede explicar, solo te das cunta de lo correcto cuando lo ves :)

Saludos
Pues sí que debe de ser un arte: he estado buceando en el wiki de Ward y me he encontrado con todo tipo de opiniones, desde los que dicen evita las excepciones siempre que puedas hasta los que dicen que las excepciones son nuestras amigas. En fin, hay para pensar un montón en la categoría excepciones.
Es cierto que hay veces en las que es difícil saber que es lo correcto. Aunque lo incorrecto se detecta rápido:

http://thedailywtf.com/forums/44872/ShowPost.aspx

try //try to connect to Sequel Server
{
if(!service.ConnectToSQL(LoginInfo.GetConnectingStringArrayToSQL()))
{
Close();
return;
}
}
catch(ArgumentOutOfRangeException)
{
MessageBox.Show(
"New version of the TPS Manager program is required.\n" +
"Please contact the administrator of TPS Manager and ask for the updated version.");

if(Environment.UserName == "yuri")
{
if(MessageBox.Show(
"Would you like to update the SQL server with the current version?"
,"Update",MessageBoxButtons.YesNo) == DialogResult.Yes)
{
service.SetProgramVersionOnSQL();
}
}
Close();
return;
}
catch(Exception ex1) //connection to SQL server failed
{
MessageBox.Show(ex1.Message);
Close();
return;
}

------------------------------------
http://thedailywtf.com/forums/45199/ShowPost.aspx

try
{
// [lots of code that accesses database thru helper functions...]
}
catch (Exception e)
{
if (e.Message ==
"Cannot insert duplicate key row in object 'ProjectIDCode' with unique "
+ "index 'adx_Projects_ProjectIDCode'.\r\n"
+ "Unexpected error inserting Profile.\r\n"
+ "The statement has been terminated.")
{
lblError.Text =
"This code is already associated with another "
+ "Project, please select another code.";
return;
}
else
{
throw;
}
}
Publicar un comentario

This page is powered by Blogger. Isn't yours?

Blogroll
Enlaces
Archivos

Licencia Creative Commons
Este trabajo tiene licencia Creative Commons License.