Skip to content

Publicaciones

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á teniendo dificultades. Está intentando evitar usar try/catches para impulsar la lógica empresarial.

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 que yo.

El código se encuentra a continuación; 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;
        }

Existe 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 a medida que interactúo con el código, me resulta evidente que es un error arquitectónico.

Podrías preguntarte, ¿por qué es malo lanzar una excepción en caso de nulos?

A continuación se presentan algunas directrices a considerar al 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 necesaria. 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 más intensivas en recursos que se pueden realizar en .Net.
  3. Una excepción es exactamente eso, una excepción. Es una excepción a los supuestos realizados en el código; cuando estos supuestos 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 ascendente en un bloque try/catch para aplicar reglas empresariales. Un valor nulo es una oportunidad empresarial para controlar el flujo de la aplicación. La acción sobre el valor nulo debe realizarse en el punto en el que debe tomarse una decisión empresarial. Por ejemplo, una variable de cliente es nula, en la capa de interfaz de usuario se muestra un mensaje al usuario indicando que el cliente con id ‘1234’ no se puede encontrar.

Autor: Chuck Conway es un Ingeniero de IA con casi 30 años de experiencia en ingeniería de software. Construye sistemas de IA prácticos—canalizaciones de contenido, agentes de infraestructura y herramientas que resuelven problemas reales—y comparte lo que está aprendiendo en el camino. Conéctate con él en redes sociales: X (@chuckconway) o visítalo en YouTube y en SubStack.

↑ Volver arriba

También te puede interesar