La programmation concerne le travail
Je pense que la meilleure façon de répondre à cette question est de comprendre les progrès réalisés par OOP au fil des ans. Tout ce qui est fait dans la POO (et la plupart des paradigmes de programmation, d'ailleurs) est modelé sur le besoin de travail .
Chaque fois qu'une méthode est appelée, l'appelant dit "Je ne sais pas comment faire ce travail, mais vous savez comment, alors vous le faites pour moi".
Cela présentait une difficulté: que se passe-t-il lorsque la méthode appelée sait généralement comment faire le travail, mais pas toujours? Nous avions besoin d'un moyen de communiquer "Je voulais vous aider, je l'ai vraiment fait, mais je ne peux pas le faire."
Une des premières méthodes utilisées pour communiquer cela consistait simplement à renvoyer une valeur "déchet". Peut-être que vous vous attendez à un entier positif, la méthode appelée renvoie donc un nombre négatif. Pour ce faire, vous pouvez également définir une valeur d'erreur quelque part. Malheureusement, les deux méthodes ont abouti à ce que le code caché soit complet . Au fur et à mesure que les choses se compliquent, ce système s'effondre.
Une analogie exceptionnelle
Disons que vous avez un charpentier, un plombier et un électricien. Vous voulez que le plombier répare votre évier, alors il l'examine. Ce n'est pas très utile s'il vous dit seulement: "Désolé, je ne peux pas le réparer. C'est cassé." Enfer, c'est encore pire s'il jetait un coup d'œil, partait et vous envoyait une lettre vous disant qu'il ne pouvait pas le réparer. Maintenant, vous devez vérifier votre courrier avant même de savoir qu'il n'a pas fait ce que vous vouliez.
Ce que vous préférez, c'est qu'il vous le dise: "Ecoute, je ne pourrais pas régler le problème, car il me semble que ta pompe ne fonctionne pas."
Avec ces informations, vous pouvez en conclure que vous souhaitez que l’électricien examine le problème. L'électricien trouvera peut-être un élément lié au menuisier et vous devrez le faire réparer par le menuisier.
Heck, vous ne savez peut-être même pas que vous avez besoin d'un électricien, vous ne savez peut-être pas de qui vous avez besoin. Vous êtes juste un cadre dans une entreprise de réparation de maison et votre objectif est la plomberie. Vous dites donc que vous êtes le chef du problème, puis il demande à l'électricien de le régler.
C’est ce que les exceptions modélisent: les modes de défaillance complexes de manière découplée. Le plombier n'a pas besoin de savoir à propos d'électricien - il n'a même pas besoin de savoir que quelqu'un en amont peut résoudre le problème. Il ne fait que rendre compte du problème rencontré.
Alors ... un anti-motif?
Ok, la première étape consiste donc à comprendre le point des exceptions. La prochaine consiste à comprendre ce qu'est un anti-modèle.
Pour être qualifié d'anti-pattern, il faut
- résoudre le problème
- avoir des conséquences définitivement négatives
Le premier point est facilement satisfait - le système a fonctionné, non?
Le deuxième point est plus collant. La principale raison d'utiliser des exceptions en tant que flux de contrôle normal est mauvaise, car ce n'est pas leur objectif. Toute fonctionnalité donnée dans un programme doit avoir un objectif relativement clair, et la cooptation de cet objectif crée une confusion inutile.
Mais ce n'est pas un préjudice définitif . C'est une mauvaise façon de faire les choses, et bizarre, mais un anti-modèle? Non, juste ... étrange.