web-dev-qa-db-fra.com

Quand utiliser les blocs Try Catch

Ok, cela pourrait être une question très simple, mais je trouve que PHP La documentation à ce sujet et plusieurs recherches sur Internet ne me donnent aucune idée à ce sujet.

Quand dois-je utiliser des blocs try-catch pour améliorer mon application?

J'ai lu quelqu'un disant que nous devrions utiliser des blocs try-catch uniquement pour éviter les erreurs fatales. J'ai lu quelqu'un d'autre disant que nous ne devrions l'utiliser que sur des erreurs inattendues (attendez quoi? Inattendu? S'il s'agit d'erreurs inattendues, comment pourrais-je les empêcher avec try-catch? Dois-je mettre tout mon code d'application dans un bloc try?) D'autres disent simplement que les blocs try-catch doivent être utilisés partout car ils peuvent également être étendus (extension de la classe Exception). Enfin, quelqu'un dit que PHP bloc try-catch sont totalement inutiles car ils sont très mal implémentés. (Sur cela, j'ai trouvé une belle SO question sur les performances).

Il me semble que ce sujet est très étrange et confus. Quelqu'un pourrait-il m'éclairer?

61
Shoe

Il me semble que ce sujet est très étrange et confus. Quelqu'un pourrait-il m'éclairer?

Absolument. Je ne suis pas un utilisateur de PHP, mais je pourrais avoir un petit aperçu après avoir travaillé avec try/catch en ActionScript, Java et JavaScript. Gardez cependant à l'esprit que différents langages et plates-formes encouragent différentes utilisations pour try/catch. Cela dit ...

Les seules fois où je recommanderais d'utiliser try/catch, c'est si vous utilisez une fonction en langue native

  1. Peut lancer une erreur/exception
  2. Ne vous donne aucun outil pour détecter si vous êtes sur le point de faire quelque chose de stupide qui provoquerait cette erreur/exception. Par exemple: dans ActionScript, la fermeture d'un chargeur qui n'est pas ouvert entraînera une erreur mais le chargeur n'a pas de propriété isOpen à vérifier, vous êtes donc obligé de l'envelopper dans try/catch pour réduire au silence une erreur par ailleurs totalement dénuée de sens.
  3. L'erreur/exception est vraiment sans signification.

Prenons les exemples que vous donnez et voyons comment ils concordent avec cette liste.

J'ai lu quelqu'un disant que nous devrions utiliser des blocs try-catch uniquement pour éviter les erreurs fatales.

Dans le cas de la fonction loader.close () d'AS, c'est un bon conseil. C'est une erreur fatale, et tout cela à partir d'un faux pas autrement trivial. D'un autre côté, pratiquement TOUTES les erreurs dans AS entraîneront l'arrêt de votre application. Souhaitez-vous les envelopper tous dans try/catch? Absolument pas! Une "erreur fatale" est fatale pour une raison. Cela signifie que quelque chose de terriblement mauvais s'est produit et que l'application continue dans un état potentiellement "non défini" est imprudent. Il est préférable de savoir qu'une erreur s'est produite, puis de la corriger plutôt que de simplement la laisser disparaître.

J'ai lu quelqu'un d'autre disant que nous ne devrions l'utiliser que sur des erreurs inattendues

C'est encore pire. Ce sont surtout les erreurs que vous NE VOULEZ PAS faire taire, car les faire taire signifie que vous ne les trouverez jamais. Peut-être que vous ne les avalez pas, cependant ... peut-être que vous les enregistrez. Mais pourquoi voudriez-vous essayer/catch/log/continue comme si de rien n'était, permettant au programme de s'exécuter dans un état potentiellement dangereux et inattendu? Laissez simplement l'erreur vous donner un coup de pied dans les dents et corrigez-la. Il n'y a rien de plus frustrant que d'essayer de déboguer quelque chose qui ne va pas dans un programme que quelqu'un d'autre a écrit parce qu'il a tout emballé dans un bloc try/catch puis négligé de se connecter.

D'autres disent simplement que les blocs try-catch doivent être utilisés partout car ils peuvent également être étendus (extension de la classe Exception).

Il y a un intérêt potentiel à cela si vous êtes le seul à lancer et que vous essayez de vous alerter d'une situation exceptionnelle dans votre programme ... mais pourquoi essayer/attraper votre propre erreur lancée? Laissez-le vous donner un coup de pied dans les dents, puis réparez-le afin que vous n'ayez plus besoin de lancer l'erreur.

Enfin, quelqu'un dit que PHP bloc try-catch sont totalement inutiles car ils sont très mal implémentés. (Sur cela, je trouve une belle SO question sur les performances).

Peut-être. Je ne peux pas répondre à celui-ci cependant.

Donc ... cela pourrait être un peu une question religieuse, et je suis certain que certaines personnes seront en désaccord avec moi, mais de mon point de vue particulier, ce sont les leçons que j'ai apprises au fil des ans sur le try/catch.

36
scriptocalypse

Différentes personnes vous diront différentes choses. Mais c'est ce que je pense, notamment dans le cas d'une application web.

Votre page entière doit être dans un essai/capture qui affiche un message d'erreur à l'utilisateur. Le message d'erreur ne doit pas dire à l'utilisateur ce qui s'est passé en détail car c'est un problème de sécurité. Il doit enregistrer des informations sur l'erreur dans un fichier journal.

L'autre cas est celui où quelque chose pourrait mal tourner dans le fonctionnement normal des affaires. PHP n'est pas très content d'exception donc cela peut ne pas se produire beaucoup. Fondamentalement, si vous exécutez une fonction qui lève une exception quand elle échoue, vous pouvez intercepter l'exception et faire autre chose dans ce Cas.

En général, votre question revient à vous demander comment utiliser un marteau pour améliorer la qualité d'une maison. Utilisez des exceptions pour vous aider à implémenter des comportements particuliers. Ne cherchez pas d'endroits pour utiliser les exceptions.

11
Winston Ewert

Je pense que c'est simplement une question de préférences, mais d'après mon expérience, je vous encourage à les utiliser autant que possible.

Dans l'application que nous développons actuellement au travail (en utilisant Zend Framework si cela importe), nous utilisons un seul bloc try..catch pour intercepter toutes les exceptions dans l'application qui sont montrées à l'utilisateur comme, par exemple, l'erreur 500s et l'exception est enregistrée avec plus informations à la base de données. Personnellement, j'aime cette approche en cas d'application PHP car les exceptions sont extensibles et vous pouvez essentiellement écrire toutes les fonctionnalités dont vous avez besoin.

5
Ondrej Slinták

J'utilise principalement Try/Catch autour des appels de base de données ... en particulier les entrées, les mises à jour et les suppressions, etc.

Je l'utilise parfois pour le traitement de données complexes avec des tableaux et des boucles utilisant des données et des tableaux dynamiques où il y a un risque que quelque chose se passe mal, c'est-à-dire: des éléments de tableau manquants ou quelque chose (je vérifie normalement des choses comme ça cependant).

Je les utilise également pour des opérations sur lesquelles je n'ai pas un contrôle total, comme l'importation de données à partir d'une source de données externe ou étrangère où il pourrait y avoir des problèmes avec les données ou l'accès au fichier source.

Je pense que ce que l'on entend par "erreurs inattendues" est l'endroit où vous ne pouvez pas éviter les problèmes grâce à de bonnes pratiques de programmation telles que la vérification si un fichier existe avant de "l'inclure", certains problèmes que vous POUVEZ anticiper, utilisez donc de bonnes pratiques pour les éviter. Ne vous contentez pas de les laisser au hasard en les enveloppant dans un try/catch.

Utilisez plutôt de bonnes pratiques de programmation comme vous devriez le faire partout. N'utilisez pas try/catch comme raccourci paresseux pour tout, partout. C'est une exagération majeure.

3
gmize

Je suis d'accord avec @scriptocalypse. En fait, je n'utilise que des blocs try/catch dans PHP dans 2 types de situations.

  1. S'il est possible que des problèmes externes (pas à l'intérieur de mon code) ou des erreurs de base de données se produisent:

    • Obtenir des données d'une autre source (par exemple, curl)
    • Obtention de données à partir de fichiers
    • DB-Exceptions
  2. Si je travaille à l'intérieur d'un autre système, comme un CMS ou similaire et que je souhaite remplacer un certain comportement. Par exemple, je ne veux pas qu'une exception soit levée mais que le message d'exceptions soit renvoyé à la vue.

1
toesslab

Normalement, je mets Try and Catch autour des zones du code qui ont des forces externes agissant sur celui-ci sur lesquelles je n'ai aucun contrôle. Par exemple, Ouverture et lecture de fichiers externes .. vous n'avez aucun contrôle qu'à un moment donné de la lecture du fichier, le fichier est corrompu ou quelque chose d'autre se produit que vous ne pouvez pas contrôler comme le serveur de fichiers DC ou quelque chose

0
Andrew Burns

Vous ne pouvez pas mettre des blocs de capture d'essai partout.

Cependant, pendant les tests d'application, les exceptions générées devraient vous alerter sur les endroits où vous devez essayer les captures. C'est une des raisons pour lesquelles vous devez effectuer des tests approfondis de votre application/code.

Si vous voyez un endroit où vous pensez en avoir besoin, j'en mettrais un.

EDIT: ok vous POUVEZ les mettre partout, mais vous avez besoin de savoir où les mettre dans votre code.

0
Simon