
Un collègue a envoyé un email avec du code avec lequel il a des difficultés. Il essaie d’éviter d’utiliser des try/catches
pour piloter la logique métier.
Le problème n’est pas les try/catches
, c’est simplement un symptôme du problème. Pouvez-vous identifier le problème ? Vous devrez faire quelques suppositions, mais j’ai confiance que vous arriverez à la même conclusion que moi.
Le code est ci-dessous ; je l’ai modifié pour protéger les innocents :
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;
}
Il y a une philosophie sous-jacente dans ce système selon laquelle les nulls sont mauvais. Dans la plupart des cas où un null peut être généré, une exception est lancée. Au début, je n’y voyais pas de problème. Je considérais cela comme une décision architecturale, une esthétique, mais en interfaçant avec le code, il m’apparaît clairement que c’est une erreur architecturale.
Vous pourriez demander, pourquoi lancer une exception dans le cas de nulls est-il mauvais ?
Voici quelques directives à considérer lors du lancement d’une exception :
- Le fait que vous deviez vérifier le null pour lancer l’exception devrait être un indice qu’elle n’est pas nécessaire. C’est un résultat attendu, donc pas une exception.
- Lancer une exception est une opération gourmande en ressources, l’une des opérations les plus gourmandes en ressources qui puisse être effectuée en .Net.
- Une
exception
est exactement cela, une exception. C’est une exception aux hypothèses faites dans le code – quand ces hypothèses sont brisées, le système doit se terminer, il ne peut pas continuer car le système est dans un état inconnu (c’est-à-dire que la base de données n’est plus disponible) cela pourrait aussi être un vecteur d’attaque. - Lancer une exception signifie que vous devez envelopper l’appel en amont dans un bloc
try/catch
pour appliquer les règles métier. Une valeur null est une opportunité métier pour contrôler le flux de l’application. L’action sur la valeur null devrait être effectuée au point où une décision métier doit avoir lieu. Par exemple, une variable customer est null, au niveau de la couche UI un message est affiché à l’utilisateur indiquant que le client avec l’id ‘1234’ ne peut pas être trouvé.
Auteur : Chuck Conway se spécialise dans l’ingénierie logicielle et l’IA générative. Connectez-vous avec lui sur les réseaux sociaux : X (@chuckconway) ou visitez-le sur YouTube.