Skip to content

Posts

Considerações ao Lançar Exceções

21 de março de 2013 • 2 min de leitura

Considerações ao Lançar Exceções

Um colega de trabalho enviou um email com algum código com o qual ele está lutando. Ele está tentando evitar usar try/catches para conduzir a lógica de negócio.

O problema não são os try/catches, é simplesmente um sintoma do problema. Você consegue identificar o problema? Você terá que fazer algumas suposições, mas tenho fé de que chegará à mesma conclusão que eu cheguei.

O código está abaixo; eu o modifiquei para proteger os 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;
        }

Há uma filosofia subjacente neste sistema de que nulos são ruins. Na maioria dos casos onde um nulo pode ser gerado, uma exceção é lançada. No início eu não via problema nisso. Eu via como uma decisão arquitetural, uma estética, mas conforme interfaceio com o código, fica aparente para mim que é um erro arquitetural.

Você pode perguntar, por que lançar uma exceção no caso de nulos é ruim?

Abaixo estão algumas diretrizes ao considerar lançar uma exceção:

  1. O fato de você ter que verificar o nulo para lançar a exceção deveria ser uma dica de que não é necessário. É um resultado esperado, portanto não é uma exceção.
  2. Lançar uma exceção é uma operação intensiva em recursos, uma das operações mais intensivas em recursos que podem ser feitas no .Net.
  3. Uma exceção é exatamente isso, uma exceção. É uma exceção às suposições feitas no código – quando essas suposições são quebradas, o sistema deve terminar, não pode prosseguir porque o sistema está em um estado desconhecido (ou seja, o banco de dados não está mais disponível) isso também pode ser um vetor de ataque.
  4. Lançar uma exceção significa que você tem que envolver a chamada upstream em um bloco try/catch para impor regras de negócio. Um valor nulo é uma oportunidade de negócio para controlar o fluxo da aplicação. A ação sobre o valor nulo deve ser feita no ponto em que uma decisão de negócio deve ser tomada. Por exemplo, uma variável customer é nula, na camada de UI uma mensagem é mostrada ao usuário informando que o cliente com id ‘1234’ não pode ser encontrado.

Autor: Chuck Conway é especialista em engenharia de software e IA Generativa. Conecte-se com ele nas redes sociais: X (@chuckconway) ou visite-o no YouTube.

↑ Voltar ao topo

Você também pode gostar