web-dev-qa-db-fra.com

Quel est l’avantage d’utiliser try {} catch {} vs si {} else {}

Je suis en train de passer de mysql en php à PDO et j'ai remarqué que le moyen le plus courant de 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.)?

53
jeroen

J'utiliserais le bloc try/catch lorsque le chemin normal du code devrait suivre sans erreur, à moins qu'il existe des conditions exceptionnelles - par exemple, le serveur est en panne, vos informations d'identification expirées ou 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. Autrement dit, 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 attendez 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 à surveiller est l’utilisation peu judicieuse 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 l'envelopper dans un essai/attraper et espérer le meilleur" de la programmation. En règle générale, vous souhaiterez limiter les types d'exceptions que vous interceptez à celles qui ne sont pas liées au code lui-même (serveur arrêté, informations d'identification incorrectes, etc.) afin de pouvoir rechercher et résoudre les erreurs liées au code (pointeurs nuls, etc.). .) 

51
tvanfosson

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 vous pour prédire quand l'erreur se produira.

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

15
Perchik

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

7
Trap

L'avantage d'essayer/attraper, et les exceptions en général, est plus pour les personnes en développement bibliothèques comme 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 qui 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 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 qui peuvent vous aider à comprendre pourquoi l’exception a été levée

C'est la théorie quand même. 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. 

7
Alan Storm

Lancer et attraper une exception est une opération coûteuse comparée à la plupart des autres opérations primitives. S'il s'agit d'un élément 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 généré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. 

6
Not Sure

C’est exactement l’avantage, utiliser un essai/attraper au lieu de plusieurs instructions if Vous serez également en mesure de détecter les erreurs imprévues.

5
Shaun Humphries

@Perchik:

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

Vous devriez utiliser if/else pour traiter tous les cas que vous prévoyez. Not utilisez try {} catch {} pour gérer everything (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. Vous devriez utiliser try {} catch {} dans les situations où vous soupçonnez que quelque chose peut/va mal tourner et que vous ne voulez pas que le système tout entier tombe en panne, comme les problèmes de délai d'attente réseau/d'accès au système de fichiers t existent, etc.

Vexing exceptions

5
Jared Updike

Tous les autres avaient de bonnes réponses - mais je me suis dit que je mettrais les miennes dans:

  1. Try/Catch est un mécanisme de gestion des exceptions - donc si vous modifiez vos exceptions, cela fonctionnera automatiquement sur 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 qui pourrait tuer le if/else et, en outre, l'instruction try peut être annulée (si vous êtes averti).
3
Adam Nelson

Comme PDO utilise des objets, ils 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 - elles ne partagent rien avec try/catch.

3
Björn

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

Exemple: - Je suis dans la controller et je valide les données utilisateur à l'aide de Models.

Si une erreur se déclenche, je dois simplement lever une exception à partir des méthodes Model.

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

Il y a donc moins de frais généraux à retourner et à vérifier.

En dehors de cela, Try Catch fonctionne très bien lorsque vous utilisez in chain (Try - Catch dans un autre Try - Catch). 

2
Amit Singh

Complètement d'accord avec @Jared Updike

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

par exemple. Il devrait s'agir d'une clause "else" indiquant à un utilisateur du guichet automatique, le message "Solde bancaire insuffisant" lorsque son solde est faible. Et ce message NE PEUT PAS être assis dans un bloc "catch" pour une raison quelconque !! 

1
Vijay Dev

Supposons que nous écrivions un code de division a/b et que le cas d’exception le plus célèbre se soit produit: 0 erreur de division, que pensez-vous que l’on puisse 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. 

0
xscorp7