Question

Je suis passé de mysql en php à PDO et j'ai remarqué que la méthode la plus courante pour tester les erreurs consiste à utiliser une combinaison try / catch au lieu de combinaisons if / else.

Quel est l’avantage de cette méthode, puis-je utiliser un bloc try / catch au lieu de plusieurs blocs if / else imbriqués pour gérer toutes les erreurs des différentes étapes (connecter, préparer, exécuter, etc.)?

Était-ce utile?

La solution

J'utiliserais le bloc try / catch lorsque le chemin normal du code devrait continuer sans erreur, sauf en cas de conditions exceptionnelles - par exemple, le serveur est en panne, vos informations d'identification ont expiré ou sont incorrectes. Je ne l'utiliserais pas nécessairement pour traiter des erreurs non exceptionnelles - disons, par exemple, l'utilisateur actuel ne joue pas le rôle correct. En d’autres termes, lorsque vous pouvez raisonnablement vous attendre à une erreur qui n’est pas une condition exceptionnelle et la gérer, je pense que vous devriez faire vos vérifications.

Dans le cas où vous avez décrit la configuration et l'exécution d'une requête, un bloc try / catch est un excellent moyen de le gérer car vous vous attendez normalement à ce que la requête aboutisse. D'autre part, vous voudrez probablement vérifier que le contenu du résultat correspond à ce que vous attendiez de la logique de flux de contrôle plutôt que d'essayer simplement d'utiliser des données qui pourraient ne pas être valides pour votre objectif.

Une chose que vous voulez surveiller est une utilisation négligée de try / catch. Essayez / attrapez ne devrait pas être utilisé pour vous protéger contre une mauvaise programmation - le "Je ne sais pas ce qui se passera si je fais cela, alors je vais le résumer en un essai / attraper et espérer le meilleur" type de programmation. En règle générale, vous souhaiterez limiter les types d’exceptions capturées à celles qui ne sont pas liées au code lui-même (serveur hors service, informations d’identité incorrectes, etc.) afin de pouvoir rechercher et corriger les erreurs liées au code (pointeurs nuls, etc. .)

Autres conseils

En général, les blocs try-catch sont intéressants, car ils se briseront (passeront à l'instruction catch) chaque fois que l'exception se produira. Les blocs if-else reposent sur votre capacité à prévoir quand l'erreur se produira.

Modifier: De plus, les blocs catch n'empêcheront pas votre code de s'arrêter lorsqu'une erreur est rencontrée.

L'avantage de try / catch, et des exceptions en général, concerne davantage les utilisateurs en développement , tels que PDO. Ils permettent à un développeur système de gérer rapidement et facilement des situations non définies ou des résultats inattendus. Prenez une connexion à la base de données. Que devrait faire un système si la base de données ne peut pas être atteinte. Cela devrait-il arrêter l'exécution? Réessayer? Lancer un avertissement et continuer? Le développeur système ne peut pas savoir ce que vous devez faire, il lève une exception, que vous attraperez et manipulerez plus tard.

L'avantage pour vous, en tant que consommateur du système, est plutôt que de récupérer un code d'erreur vague ou un simple booléen faux indiquant qu'il a échoué. Vous obtenez un objet Exception qui

  1. Définissez le nom de manière à indiquer plus clairement ce qui ne va pas (si je me souviens bien, PDO n'a qu'un seul type d'exception, mais d'autres systèmes contiennent plusieurs types d'exceptions pour différents types d'erreurs)

  2. Peut / devrait contenir des méthodes et des propriétés pouvant vous aider à comprendre pourquoi l’exception a été levée

C'est la théorie de toute façon. Il y a beaucoup de gens intelligents qui prétendent que les exceptions sont la voie à suivre. Il y a aussi beaucoup de gens intelligents qui pensent qu'Exceptions est le diable et une béquille pour les développeurs de systèmes paresseux. Il n’ya rien qui ressemble à un consensus sur cette question.

Try / Catch sépare totalement la logique de traitement des erreurs de la logique métier de l'objet.

Lancer et intercepter une exception est une opération coûteuse comparée à la plupart des autres opérations primitives. S'il s'agit d'un morceau de code qui doit fonctionner correctement (par exemple, dans une boucle serrée), vous voudrez examiner votre cas d'utilisation - si vous vous attendez à ce que les exceptions soient lancées assez souvent, vous ferez mieux avec un if. / else perforance-wise (sauf si le code sous-jacent est juste une exception pour vous, auquel cas il n'y a aucun gain). Si les exceptions ne sont levées que dans de rares circonstances, vous feriez mieux d'utiliser un système try / catch pour éviter les frais généraux liés aux ramifications dans une boucle serrée.

@Perchik:

Ma philosophie générale de la gestion des erreurs:

Vous devriez utiliser if / else pour traiter tous les cas que vous prévoyez. Vous ne devriez pas utiliser try {} catch {} pour traiter tout (dans la plupart des cas), car une exception utile pourrait être déclenchée et vous pourrez en apprendre davantage sur la présence d'un bogue. il. Vous devriez utiliser essayer {} catch {} dans les situations où vous soupçonnez que quelque chose peut / va mal tourner et que vous ne voulez pas que tout le système soit en panne, comme les problèmes de délai d'attente du réseau / d'accès au système de fichiers, les fichiers n'existent pas, etc.

Exceptions contrariantes

C’est exactement l’avantage, en utilisant une instruction try / catch au lieu de plusieurs instructions if. Vous pourrez également détecter les erreurs imprévues.

Etant donné que PDO utilise des objets, ceux-ci déclenchent des exceptions en cas d'erreur. Les anciens mysql / mysqli n'étaient que des fonctions et ne lançaient pas Exceptions, ils renvoyaient simplement des codes d'erreur. Try / catch est utilisé lorsqu'une exception peut être levée du code et que vous l'attrapez dans la clause catch, qui est un moyen orienté objet de gérer les erreurs. Vous ne pouvez pas attraper des exceptions avec des blocs if / else - ils ne partagent rien avec try / catch.

Tous les autres avaient de bonnes réponses - mais j’ai pensé que jetterais les miennes dans:

  1. Try / Catch est un mécanisme de traitement des exceptions. Ainsi, si vous modifiez vos exceptions, cela fonctionnera automatiquement pour toutes les instructions try / catch.
  2. Try / Catch donne la possibilité d'exécuter du code même dans le cas d'une exception majeure susceptible de tuer le if / else et, en outre, l'instruction try peut être annulée (si vous êtes averti).

En php en utilisant Try Catch avec héritage, nous pouvons lever une exception d’une autre classe.

Exemple: - Je suis dans le contrôleur et je valide les données de l'utilisateur à l'aide de Modèles .

Si une erreur se déclenche, il suffit de lever une exception avec les méthodes Model .

L'exécution de try sera interrompue et interceptée dans le bloc Catch .

Il y a donc moins de frais généraux liés au renvoi des valeurs bool et à la vérification de celle-ci.

En dehors de cela, Try Catch fonctionne très bien lors de l'utilisation en chaîne ( Try-Catch dans un autre Try-Catch ).

Tout à fait d'accord avec @Jared Updike

Généralement, la gestion des exceptions se fait de manière à ce que l'utilisateur ne sache rien ou presque. D'autre part, l'utilisateur du système sait ce qui se passe dans un bloc if-else.

par exemple. Ce devrait être un " else " une clause indiquant à un utilisateur du guichet automatique, le message "Solde bancaire insuffisant". quand son équilibre est faible. Et ce message NE PEUT PAS être assis dans une "capture". bloquer pour une raison quelconque !!

Supposons que nous écrivons un code de division a / b et que le cas d’exception le plus célèbre se soit produit, à savoir une erreur de division 0, que pensez-vous pouvoir faire ensuite?  1. Vous pouvez imprimer un message et quitter.  2. Vous pouvez imprimer un message et laisser l’utilisateur saisir à nouveau les valeurs, etc.

Il existe des cas où différentes personnes / fournisseurs souhaitent traiter le même cas d'exception de manière différente. Le bloc catch leur permet de le faire facilement. Si vous devez modifier la manière dont un cas d'exception sera traité, il vous suffit de modifier le bloc catch.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top