Skip to content
Perspectivas e Iteraciones Entendiendo la IA: técnico, cotidiano y reflexiones.
← atrás

Consideraciones al Lanzar Excepciones

21 de marzo de 2013 • 3 min de lectura

Consideraciones al Lanzar Excepciones

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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.
↑ Volver arriba

Autor: Chuck Conway se especializa en ingeniería de software e IA Generativa. Conéctate con él en redes sociales: X (@chuckconway) o visítalo en YouTube.