Ma ligne directrice personnelle est la suivante : une exception est levée lorsqu'une hypothèse fondamentale du bloc de code en cours s'avère fausse.
Exemple 1 : disons que j'ai une fonction qui est censée examiner une classe arbitraire et retourner vrai si cette classe hérite de List<>. Cette fonction pose la question suivante : "Cet objet est-il un descendant de List ?". Cette fonction ne devrait jamais lever une exception, car il n'y a pas de zones grises dans son fonctionnement - chaque classe unique hérite ou non de List<>, donc la réponse est toujours "oui" ou "non".
Exemple 2 : disons que j'ai une autre fonction qui examine une List<> et renvoie true si sa longueur est supérieure à 50, et false si la longueur est inférieure. Cette fonction pose la question "Cette liste a-t-elle plus de 50 éléments ?". Mais cette question fait une supposition - elle suppose que l'objet qui lui est donné est une liste. Si je lui donne un NULL, alors cette supposition est fausse. Dans ce cas, si la fonction renvoie soit vrai o faux, alors il enfreint ses propres règles. La fonction ne peut pas retourner tout ce qui est et prétendre qu'il a répondu correctement à la question. Donc il ne revient pas - il lève une exception.
Ce chiffre est comparable à celui de l "question tendancieuse" une erreur logique. Chaque fonction pose une question. Si l'entrée qui lui est donnée rend cette question fallacieuse, alors elle lève une exception. Cette ligne est plus difficile à tracer avec les fonctions qui retournent void, mais l'essentiel est que si les hypothèses de la fonction sur ses entrées sont violées, elle doit lancer une exception au lieu de retourner normalement.
L'autre aspect de cette équation est le suivant : si vous constatez que vos fonctions lèvent fréquemment des exceptions, vous devez probablement affiner leurs hypothèses.
76 votes
Veuillez rouvrir le dossier, il s'agit d'une question très sensée et valable. Toute question implique une certaine quantité d'opinion, mais dans ce cas-ci
12 votes
Je suis également d'accord pour que cette question soit rouverte car elle est liée aux meilleures pratiques. D'ailleurs, les meilleures pratiques sont toujours des opinions qui peuvent aider les autres.
6 votes
Microsoft dit : "Ne pas renvoyer de codes d'erreur. Les exceptions sont le principal moyen de signaler les erreurs dans les frameworks" et "...Si un membre ne peut pas réussir à faire ce qu'il est censé faire, cela doit être considéré comme un échec d'exécution et une exception doit être levée". msdn.microsoft.com/library/ms229030%28v=vs.100%29.aspx
8 votes
Il peut s'agir d'exceptions tout à fait raisonnables, mais cela dépend des méthodes qui les lancent. Une méthode appelée
IsCredentialsValid(username,password)
ne doit pas lever une exception si le nom d'utilisateur ou le mot de passe est invalide, mais renvoyer false. Mais disons qu'une méthode qui lit les données de la base de données pourrait légitimement lancer une telle exception, si l'authentification échoue. En résumé : vous devriez lever une exception si une méthode n'est pas en mesure d'accomplir la tâche qu'elle est censée accomplir.0 votes
En général, les exceptions doivent être utilisées si la fonction qui constate l'erreur ne peut pas s'en remettre.
0 votes
@Matsen75 Puisque les frameworks utilisent généralement la POO, les exceptions doivent être utilisées au lieu des erreurs car les exceptions sont la manière de la POO de gérer quelque chose d'imprévisible. Dans l'ancienne programmation procédurale, les erreurs étaient le moyen de gérer les circonstances imprévisibles. Les erreurs peuvent donc être considérées comme l'ancienne implémentation des exceptions. Par conséquent, en PHP, les erreurs et les exceptions sont définies comme des interfaces "throwable" et peuvent donc être utilisées de manière interchangeable. Cependant, il est recommandé de ne pas les mélanger. De même, les coupures comme "do stuff or die(errormsg)" doivent être évitées.