
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:
- 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.
- 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.
- 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. - 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.