Quand utiliser les blocs Try Catch

Ok, cela pourrait être une question très noob, mais je trouve que la documentation PHP sur cette et plusieurs searchs sur Internet ne m'a donné aucune idée à ce sujet.

Quand dois-je utiliser des blocs try-catch pour améliorer ma request?

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 en disant que nous devrions l'utiliser uniquement sur des erreurs inattendues (attendez-vous ce qui est inattendu? S'ils sont des erreurs inattendues, comment puis-je les empêcher d'essayer-attraper? Devrais-je mettre tout mon code d'application dans un bloc d'essai?). D'autres disent simplement que les blocs try-catch devraient être utilisés partout parce qu'ils peuvent également être étendus (extension de la class Exception). Enfin, quelqu'un dit que PHP Try-catch Block est totalement inutile car ils sont très mal implémentés. (Sur ce, j'ai trouvé une bonne question SO sur la performance).

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

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

Absolument. Je ne suis pas un user PHP, mais je pourrais avoir une petite idée après avoir travaillé avec try / catch dans ActionScript, Java et JavaScript. N'oubliez cependant pas que différentes langues et plates-forms encouragent différentes utilisations pour essayer / attraper. Cela dit…

Les seules fois que je reorderais d'utiliser try / catch, c'est si vous utilisez une fonction de langue maternelle qui

  1. Peut lancer une erreur / exception
  2. Ne vous donne aucun outil pour détecter si vous êtes sur le sharepoint faire quelque chose de stupide qui causerait 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 pour vérifier si vous êtes forcé de l'envelopper dans try / catch pour faire taire une erreur autrement absurde.
  3. L'erreur / l'exception n'a vraiment aucun sens.

Prenons les exemples que vous listz et voyez comment ils s'arrêtent avec cette list.

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 () de AS, c'est un bon conseil. C'est une erreur fatale, et tous d'une fausse erreur, autrement sortingvial. D'autre part, pratiquement TOUTES les erreurs dans AS feront cesser votre application. Voulez-vous les envelopper tous dans try / catch? Absolument pas! Une «erreur fatale» est fatale pour une raison quelconque. Cela signifie que quelque chose de terriblement erroné est arrivé et que l'application continue dans un état potentiellement «indéfini» est en colère. Il vaut mieux savoir qu'une erreur s'est produite, puis réparez-la plutôt que de la laisser aller.

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

C'est encore pire. Ce sont présument les erreurs que VOUS NE GÉRESSEZ PAS de silence, parce que leur mise en silence signifie que vous ne les findez jamais. Peut-être que vous ne les avalez pas, mais … peut-être que vous les enregistrez. Mais pourquoi essayer / attraper / log / continuer comme si rien ne se passait, permettant au programme de fonctionner dans une situation potentiellement dangereuse et inattendue? Il suffit de laisser l'erreur vous bash dans les dents, puis de le réparer. Il y a un peu plus de frustration que d'essayer de déboguer quelque chose qui ne va pas dans un programme que quelqu'un d'autre a écrit parce qu'ils ont enveloppé tout dans un bloc try / catch puis négligé de se connecter.

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

Il y a un mérite potentiel pour cela si vous faites le lancer, et vous essayez de vous alerter sur une situation exceptionnelle dans votre programme … mais pourquoi essayer / attraper votre propre erreur? Laisse-le te bash dans les dents, puis réparez-la de sorte qu'il ne soit plus nécessaire de lancer l'erreur.

Enfin, quelqu'un dit que PHP Try-catch Block est totalement inutile car ils sont très mal implémentés. (Sur ce, je trouve une bonne question SO sur la performance).

Peut-être. Je ne peux pas répondre à cette question.

Donc … ce pourrait être une question religieuse, et je suis certain que les gens ne seront pas d'accord avec moi, mais de mon sharepoint vue particulier, ce sont les leçons que j'ai appris au cours des années sur l'essai / capture.

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

Toute votre page devrait être dans un essai / capture qui affiche un message d'erreur à l'user. Le message d'erreur ne doit pas indiquer à l'user ce qui s'est passé en détail, car il s'agit d'un problème de security. Il devrait save des informations sur l'erreur dans un file journal.

L'autre cas est l'endroit où quelque chose peut aller mal dans l'opération normale des affaires. PHP n'est pas très exceptionnel, ce qui peut ne pas arriver beaucoup. Fondamentalement, si vous rencontrez une fonction qui lance une exception lorsqu'elle échoue, vous pouvez saisir l'exception et faire autre chose dans ce cas.

En général, votre question consiste à requestr comment utiliser un marteau pour améliorer la qualité d'une maison. Utilisez des exceptions pour vous aider à mettre en pratique des comportements particuliers. Ne cherchez pas les endroits pour utiliser des exceptions.

Je pense que c'est simplement une question de preferences, mais de mes expériences, je vous encourage à les utiliser autant que possible.

Dans l'application, nous développons actuellement au travail (en utilisant Zend Framework si cela count), nous utilisons un seul bloc try..catch pour capturer toutes les exceptions dans l'application qui sont montrées à l'user, par exemple, l'erreur 500 et l'exception est enregistrée avec plus informations sur la database. J'aime personnellement cette approche en cas d'application PHP car les exceptions sont extensibles et vous pouvez écrire toutes les fonctionnalités dont vous avez besoin.

J'utilise principalement Try / Catch autour des appels de database … en particulier les inputs, les mises à jour et les effacements, etc.

Je l'utilise parfois autour d'un traitement de données complexe avec des arrays et des loops utilisant des données dynamics et des arrays où il y a une chance que quelque chose puisse aller 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 autour d'opérations sur lesquelles je n'ai pas le contrôle complet, comme l'import de données provenant d'une source de données externe ou étrangère, où datatables peuvent avoir des problèmes ou accéder au file source.

Je pense que ce que l'on entend par «Erreurs inattendues» est l'endroit où vous ne pouvez pas prévenir les problèmes grâce à de bonnes pratiques de programmation, comme vérifier si un file existe avant de «l'inclure», certains problèmes que vous pouvez anticiper, utilisez les bonnes pratiques pour les prévenir. Ne les laissez pas au hasard en les enveloppant dans un essai / capture.

Utilisez de bonnes pratiques de programmation plutôt que vous devriez faire partout. N'utilisez pas try / catch comme un raccourci paresseux pour tout, partout. C'est un sursaut majeur.

Vous ne pouvez pas essayer d'attraper des blocs partout.

Cependant, pendant les tests d'application, les exceptions générées devraient vous alerter vers les endroits où vous avez besoin d'essayer des sockets. C'est une des raisons pour lesquelles vous devriez effectuer un test approfondi de votre application / code.

Si vous voyez un endroit où vous pensez que vous en avez besoin, je mettrais un.

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

Je lance normalement Try and Catch autour des zones dans le code qui ont des forces externes agissant sur ce que je n'ai aucun contrôle. Par exemple, l'ouverture et la lecture de files externes … vous n'avez aucun contrôle qu'à un moment de la lecture du file, le file est corrompu ou quelque chose d'autre se produit que vous ne pouvez pas contrôler comme le server de files cc ou quelque chose

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

  1. S'il est possible que certains problèmes externes (pas dans mon code) ou les erreurs DB puissent avoir lieu:

    • Obtention de données provenant d'une autre source (p. Ex. curl )
    • Obtention de données à partir de files
    • DB-Exceptions
  2. Si je travaille à l'intérieur d'un autre système, comme un CMS ou similaire, je souhaite replace un certain comportement. Par exemple, je ne veux pas qu'une exception soit lancée, mais le message des exceptions est returnné à la vue.