Consideraciones al Lanzar Excepciones
21 de marzo de 2013 • 3 min de lectura

Un compañero de trabajo envió un correo electrónico con código con el que está luchando. Está tratando de evitar usar try/catches
para manejar la lógica de negocio.
El problema no son los try/catches
, es simplemente un síntoma del problema. ¿Puedes identificar el problema? Tendrás que hacer algunas suposiciones, pero tengo fe en que llegarás a la misma conclusión a la que llegué yo.
El código está abajo; lo cambié para proteger a los inocentes:
private Customer GetOrCreateCustomer(long customerTelephoneNumberOrCustomerId)
{
Customer customer;
try
{
customer = this.DoMagic(customerMasterTelephoneNumberOrCustomerId);
}
catch (DataException)
{
try
{
//TODO: I know this isn't ideal. Still thinking of a better way to do this.
customer = this. GetCustomer(customerMasterTelephoneNumberOrCustomerId);
}
catch (DataException)
{
customer = this.GetCustomerFromExternal(customerMasterTelephoneNumberOrCustomerId);
customer.CustomerId = this.CreateCustomer(customer);
}
}
return customer;
}
Hay una filosofía subyacente en este sistema de que los nulos son malos. En la mayoría de los casos donde se puede generar un nulo se lanza una excepción. Al principio no vi un problema con esto. Lo vi como una decisión arquitectónica, una estética, pero mientras interactúo con el código, me resulta evidente que es un error arquitectónico.
Podrías preguntar, ¿por qué es malo lanzar una excepción en el caso de nulos?
A continuación se presentan algunas pautas al considerar lanzar una excepción:
- El hecho de que tengas que verificar el nulo para lanzar la excepción debería ser una pista de que no es necesario. Es un resultado esperado, por lo tanto no es una excepción.
- Lanzar una excepción es una operación que consume muchos recursos, una de las operaciones que más recursos consume que se pueden hacer en .Net.
- Una
excepción
es justamente eso, una excepción. Es una excepción a las suposiciones hechas en el código – cuando estas suposiciones se rompen, el sistema debe terminar, no puede continuar porque el sistema está en un estado desconocido (es decir, la base de datos ya no está disponible) esto también podría ser un vector de ataque. - Lanzar una excepción significa que tienes que envolver la llamada upstream en un bloque
try/catch
para hacer cumplir las reglas de negocio. Un valor nulo es una oportunidad de negocio para controlar el flujo de la aplicación. La acción sobre el valor nulo debería hacerse en el punto en el cual debe tomarse una decisión de negocio. Por ejemplo, una variable customer es nula, en la capa de UI se muestra un mensaje al usuario indicando que el cliente con id ‘1234’ no se puede encontrar.
También te puede gustar
- Modificar un Archivo Localmente Sin Actualizar el Repositorio Git Remoto 1 min de lectura
- Una Implementación de Búsqueda Binaria 1 min de lectura
- Los Beneficios de Usar un Framework de Construcción 2 min de lectura