Um colega de trabalho enviou um e-mail com algum código com o qual está tendo dificuldades. Ele está tentando evitar usar try/catches para conduzir a lógica de negócios.
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 confiança de que chegará à mesma conclusão que cheguei.
O código está abaixo; mudei 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;
}
Existe uma filosofia subjacente neste sistema de que nulos são ruins. Na maioria dos casos em que um nulo pode ser gerado, uma exceção é lançada. No início, não vi problema com isso. Vi como uma decisão arquitetônica, uma estética, mas conforme interajo com o código, fica aparente para mim que é um erro arquitetônico.
Você pode se 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:
- O fato de você ter que verificar o nulo para lançar a exceção deve ser uma dica de que não é necessário. É um resultado esperado, portanto, não é uma exceção.
- Lançar uma exceção é uma operação intensiva em recursos, uma das operações mais intensivas em recursos que podem ser feitas em .Net.
- Uma
exceptioné 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. - Lançar uma exceção significa que você tem que envolver a chamada upstream em um bloco
try/catchpara aplicar regras de negócios. Um valor nulo é uma oportunidade de negócios 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ócios deve ser tomada. Por exemplo, uma variável de cliente é 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 é um Engenheiro de IA com quase 30 anos de experiência em engenharia de software. Ele constrói sistemas de IA práticos—pipelines de conteúdo, agentes de infraestrutura e ferramentas que resolvem problemas reais—e compartilha o que está aprendendo ao longo do caminho. Conecte-se com ele nas redes sociais: X (@chuckconway) ou visite-o no YouTube e no SubStack.