Maison >développement back-end >tutoriel php >PHP Master | Exceptions exceptionnelles
Points de base
Exception
équivaut à dire qu'il y a un "problème" et le code n'a aucune idée de ce qui se passe. Au lieu de cela, une exception personnalisée doit toujours être jetée pour éclairer le code d'appel de la situation actuelle, fournissant ainsi un contrôle fin sur ce qui se passe. PHP 5 introduit un mécanisme de gestion des exceptions, une classe spéciale qui peut être lancée et capturée (par opposition aux erreurs lancées) pour indiquer des événements inattendus. Contrairement aux erreurs, les exceptions sont destinées à être traitées par le code d'appel et la bulle vers le haut le long de la chaîne d'exécution jusqu'à ce qu'elles soient capturées. Une fois une exception lancée, le code de la portée actuelle cessera d'exécuter (donc, aucune ligne après l'instruction throw
ne sera exécutée), et le contrôle ne sera renvoyé au premier gestionnaire d'exception correspondant (Capturant Block, gestionnaire d'exception configuré ou Handler des exceptions fourni par la langue). L'exécution du code ne se poursuit à partir de là que lorsque l'exception est capturée. Cet article n'est pas destiné à expliquer les exceptions au niveau d'entrée, mais à fournir quelques conseils sur la façon d'utiliser des exceptions. Si vous n'avez jamais utilisé d'exceptions auparavant, vous devrez peut-être consulter le manuel PHP ou lire le livre "PHP Master: Writing Code de pointe" Écrit par mes amis, ce qui explique parfaitement la nécessité d'écrire du code PHP moderne et raisonnable de toutes les connaissances de
L'erreur n'est pas une exception
Vous avez peut-être appris les exceptions, mais vous vous demandez peut-être la différence entre une erreur PHP et une exception (personnalisée). La logique est en fait très simple: l'erreur est irréparable, se produit dans la boucle d'exécution principale et indique la stabilité de l'environnement. Par exemple, si vous essayez d'accéder à la valeur scalaire en tant que tableau et d'augmenter E_NOTICE
, cela signifie qu'il y a un problème avec votre code. Rien ne garantit que l'exécution continue est sûre. Cette condition ne peut pas être corrigée lors de l'exécution. Si le T_IF
est déclenché par un E_PARSE
inattendu découvert par l'analyseur, vous comprendrez comment cela affecte la stabilité des choses. D'un autre côté, les exceptions sont récupérables, peuvent (et généralement) se produire en dehors de la boucle d'exécution principale et n'indiquent pas la stabilité du système. Il s'agit d'un composant qui dit: "Je ne peux pas compléter votre demande avec l'entrée donnée, vous pouvez donc gérer ces informations à volonté." Il ne peut donc pas compléter l'instruction donnée avec la valeur actuelle. Cela ne signifie pas que votre environnement est instable, cela signifie simplement que votre code doit ajuster la longueur de la valeur en rembourrant ou en tronçant. Votre code peut attraper cette exception, mettre à jour la valeur et réessayer. LengthException
Toutes les exceptions ne sont pas des exceptions
C'est l'une des questions les plus difficiles à répondre: qu'est-ce qu'une exception doit être jetée exactement? Bien sûr, votre exception doit être conforme à trois règles dans le paragraphe précédent. Jeter des exceptions lors de la rencontre de la mémoire corrompue est une très mauvaise pratique. Votre code doit plutôt lancer une erreur afin que PHP puisse interrompre dès que possible, car l'environnement s'avère dangereux pour continuer l'exécution. Cependant, même si les erreurs ne sont pas nécessaires, aucune exception n'est requise pour toutes les situations non succès. C'est-à-dire: toutes les situations infructueuses ne sont pas des exceptions. Le mot «anormal» fait référence à une action qui n'est pas une opération ou une norme normale, et une anomalie qui s'écarte des situations normales et attendues. Un ancien collègue m'a dit un jour au dîner que le service XML / RPC que son entreprise utilise est conçu, l'épine dorsale de toutes les opérations accessibles au public. L'architecte a ensuite appris les exceptions et leur commodité à indiquer des états non succès. Ce pilier offre une fonction de connexion unique en plus d'autres fonctionnalités. Au lieu d'accéder directement à la base de données, l'application Web interroge le service XML / RPC, qui répond ensuite en fonction du magasin de données centralisé qui sert toutes les applications Web. Lorsque des informations d'identification valides sont fournies, un statut réussi sera retourné. Lorsqu'un problème se produit, une exception est lancée et un message s'affiche indiquant la raison de l'échec. Facile à capturer, vous pouvez afficher le message à l'utilisateur avec un message d'erreur frappant et brillant. Mais l'utilisateur fournit-il un nom d'utilisateur et / ou un mot de passe incorrect qui s'écarte-t-il des attentes? Dans mon projet, les utilisateurs que je gère ne sont pas parfaits, ils seront typés ou oublieront les choses. Obtenir des informations d'identification incorrectes est très courante, encore plus courante que les informations d'identification valides. Les informations d'identification de vérification sont le comportement attendu de la connexion au système, donc dans ce cas, le service XML / RPC doit renvoyer un statut indiquant si la vérification est réussie ou non. Bien que les informations d'identification échouent, le processus de vérification lui-même est toujours exécuté avec succès. Si le processus de vérification n'est pas exécuté correctement, il y a d'autres problèmes. Peut-être que le magasin de données est inaccessible ou autre chose. Il est très rare que les systèmes de connexion ne soient pas en mesure de se connecter à leur banque de données car il ne peut pas s'exécuter sans datastores. Par conséquent, cela nécessite de lancer une exception. Remarque: Certaines personnes peuvent affirmer que le système de connexion ne se connecte pas au magasin de données est un signe que l'environnement est instable et devrait donc augmenter une erreur. Cependant, la connexion au système n'est pas responsable de l'augmentation d'une erreur pour le stockage des données. Inversement, si le connecteur de stockage de données / wrapper juge nécessaire, une erreur doit être augmentée. De manière générale, vous pouvez considérer les exceptions comme des situations où les développeurs doivent intervenir, les voir et les gérer. Le code qui se produit avec le scénario d'exception ne peut pas le faire seul. C'est probablement que le développeur a examiné le code et la façon dont il le gére est de le laisser se produire lorsque cela se produit. Ne commencez pas à envoyer des e-mails au centre des opérations du réseau; ils ne seront pas reconnaissants! Gère ce que vous pouvez et devriez gérer et l'exception n'est lancée que si elle ne peut vraiment pas continuer l'exécution.
"Problème"
Il y a quelques années, alors que je faisais une randonnée à travers l'Europe, je suis tombé sur un spectacle inoubliable dans une gare en Grèce. L'une des zones de casiers ressemblait à une bombe explosée, avec des portes disséminées sur le sol, à moitié suspendus aux charnières ou brisées. J'ai appris plus tard qu'ils supprimaient le casier, mais il convient de noter comment ils ont communiqué au client que cette zone a été désactivée. Il y avait beaucoup de ruban adhésif sur la partie centrale, avec un morceau de papier collant avec les mots "problème". Techniquement, cela est complètement correct. Il y avait évidemment quelque chose qui ne va pas avec le casier et la situation a été gérée en la communiquant au client. Vous pourriez le trouver intéressant, mais en fait, vous le voyez souvent dans votre code. Si vous lancez simplement Exception
, vous dites essentiellement "problème" et le code n'a aucune idée de ce qui se passe. Bien que Exception
soit la classe de base pour chaque exception, vous pouvez l'étendre de votre propre type. Une collection plus large d'exceptions peut être trouvée dans la bibliothèque SPL, mais c'est loin de la limite. En regardant les principaux cadres PHP comme Zend Framework ou Symfony, vous constaterez qu'ils utilisent des exceptions personnalisées pour presque toutes les situations différentes. Il est un peu lourd d'écrire tous ces fichiers afin qu'ils puissent être chargés dynamiquement et maintenir tous les différents types, mais cela fournit un contrôle fin sur ce qui se passe pour le cadre et les consommateurs de ce cadre. Si vous ne lancez que Exception
, vous pouvez seulement être sûr que quelque chose ne va pas et que vous pourriez aussi bien abandonner. Cela signifie que vous utilisez des exceptions de la façon dont ce sont des erreurs, en utilisant les blocs de capture comme opérateurs silencieux, et en abandonnant simplement l'espoir que quelqu'un puisse corriger cette situation d'une manière ou d'une autre.
Capture globale
Si c'est une mauvaise idée d'utiliser des exceptions non personnalisées et d'attraper toutes les exceptions possibles, alors pourquoi la langue le permet-il même? Il existe une exception à la règle qui utilise et attrape toujours une exception spécifique, c'est-à-dire la règle de capture globale. Un bloc de capture global est le bloc de capture de niveau le plus élevé et doit attraper toutes les exceptions qui bouillonnent à ce niveau. PHP lui-même contient un message (avez-vous vu la "Erreur fatale: exception non cambrée dans ..." Message?), Mais vous pouvez le remplacer avec un gestionnaire personnalisé pour servir de replacement. Vous pouvez définir ce gestionnaire avec la fonction set_exception_handler()
, afin que vous puissiez le faire comme vous le souhaitez et ajouter une règle à votre ensemble de règles PHPMD qui interdit les lignes comme "catch (Exception $e) {
". C'est la seule raison d'un gestionnaire d'exceptions général qui devrait être trouvé dans le code de production, qui capture chaque instance de la classe Exception
qui n'a pas encore été capturée. Les autres gestionnaires doivent être spécifiques et limités aux exceptions qu'il sait gérer et être responsables. Aller prudent ici, laisser une exception maniable bouillonner une fois (puis le réparer en code) est certainement bien mieux que de trop attraper et d'agir comme un opérateur silencieux.
Résumé
En bref, une exception est lancée uniquement lorsque votre code ne peut pas terminer les instructions demandées avec l'entrée donnée, en lançant toujours une exception personnalisée qui indique réellement le code d'appel qui est actuellement dans le cas, et si vous appelez un autre code, alors Attrape uniquement des exceptions que vous pouvez et devriez gérer. Cela rendra vos composants moins comme des boîtes noires (exceptions personnalisées) et réduira la possibilité que les développeurs intégrant vos composants doivent modifier votre code (n'atteignez pas les exceptions que vous ne devriez pas). Nous disons toujours à nos clients / gestionnaires d'être précis, mais nous devrions également être précis!
(image de Fotolia)
Des questions fréquemment posées sur la gestion des exceptions PHP
La gestion des exceptions PHP est un mécanisme puissant qui permet aux développeurs d'hyperviser les erreurs et les exceptions qui peuvent se produire lors de l'exécution d'un programme. Il fournit un moyen de transférer le contrôle d'une partie du programme à un autre. La gestion des exceptions PHP est utilisée pour modifier le flux normal d'exécution du code lorsqu'une erreur spécifiée se produit. Cela peut rendre le code plus facile à lire et à gérer car il sépare le code de traitement des erreurs de la logique du programme principal.
Dans PHP, le bloc de coups d'essai est utilisé pour gérer les exceptions. Le bloc d'essai contient du code qui peut lancer des exceptions, tandis que le bloc de capture contient du code qui sera exécuté si une exception est lancée dans le bloc d'essai. Si une exception est lancée dans le bloc d'essai, le script cesse de s'exécuter et le contrôle est passé au premier bloc de capture correspondant au type d'exception lancé.
Le blocage enfin dans la gestion des exceptions PHP est utilisé pour garantir qu'un morceau de code est toujours exécuté, que ce soit une exception ou non. Ceci est utile pour nettoyer les activités telles que la fermeture des fichiers ou des connexions de base de données qui doivent être effectuées, indépendamment du succès ou de l'échec des opérations.
Dans PHP, vous pouvez créer des exceptions personnalisées en étendant la classe d'exception intégrée. Cela vous permet d'ajouter des fonctionnalités personnalisées aux exceptions ou de créer des exceptions spécifiques au domaine d'application. Pour créer une exception personnalisée, vous pouvez définir une nouvelle classe qui étend une exception, puis ajouter toutes les méthodes ou propriétés personnalisées souhaitées.
En PHP, les erreurs sont un problème grave qui empêche les scripts de s'exécuter, tandis que les exceptions sont une condition qui modifie le processus d'exécution normal. Les erreurs sont généralement causées par des erreurs de syntaxe ou des fonctions non définies. D'un autre côté, les exceptions sont souvent utilisées pour gérer les conditions qui ne sont pas mortelles à un programme mais qui nécessitent une manipulation spéciale.
Dans PHP, vous pouvez utiliser plusieurs blocs de capture pour gérer plusieurs exceptions. Chaque bloc de capture gère les exceptions d'un type spécifique. Lorsqu'une exception est lancée, le bloc de capture est vérifié dans l'ordre qui apparaît dans le code. Le premier bloc de capture capable de gérer le type d'exception lancé sera exécuté.
Oui, vous pouvez remonter l'exception en PHP. Ceci est très utile si vous souhaitez gérer les exceptions d'une manière ou d'une autre mais que vous souhaitez avoir un niveau supérieur de gestionnaire d'exceptions. Pour remédier à l'exception, utilisez simplement l'instruction Throw dans le bloc de capture.
Dans PHP, vous pouvez enregistrer des exceptions en utilisant la fonction error_log dans le bloc Catch. Cela vous permet de enregistrer des informations sur l'exception, y compris ses messages et ses traces de pile, dans le fichier journal spécifié.
PDOException est une exception qui est lancée lorsqu'une erreur se produit dans une opération PDO. PDO (PHP Data Object) est une couche d'abstraction de bases de données qui fournit une interface cohérente pour accéder aux bases de données dans PHP. PDOException fournit des informations sur les erreurs, y compris les codes d'erreur SQLState et les messages d'erreur pour le pilote de base de données.
Dans PHP, vous pouvez gérer des exceptions non apprises en définissant une fonction de gestionnaire d'exception personnalisée, puis en le définissant comme le gestionnaire d'exceptions par défaut à l'aide de la fonction set_exception_handler. Cette fonction est appelée chaque fois qu'une exception qui n'est pas capturée par le bloc d'essai est jetée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!