Comment gérer les erreurs et les exceptions dans le framework Yii

Ce que vous allez créer

introduction

Dans le tutoriel d'aujourd'hui, je présenterai la gestion des erreurs et des exceptions de Yii et vous expliquerai quelques scénarios d'introduction.. 

Vous vous demandez ce que Yii est? Découvrez notre introduction au framework Yii et à la programmation avec Yii2.

Quelle est la différence entre les erreurs et les exceptions? 

Les erreurs sont des défauts inattendus de notre code, souvent découverts en premier par les utilisateurs. Ils vont généralement interrompre l'exécution du programme. Il est important non seulement de rompre avec élégance pour l'utilisateur, mais d'informer le développeur du problème afin qu'il puisse être résolu.

Des exceptions sont créées par le développeur lorsqu'une condition d'erreur potentiellement prévisible se produit. Dans le code où une exception peut se produire, le développeur peut déclencher () une exception à un gestionnaire d'erreurs robuste.

Comment Yii gère-t-il ces?

Dans Yii, les erreurs PHP non fatales (avertissements et notifications, par exemple) sont acheminées vers des exceptions pouvant être capturées, ce qui vous permet de décider de la façon dont vous devez y réagir et y répondre. Vous pouvez désigner une action de contrôleur pour traiter toutes ces exceptions. Et vous pouvez personnaliser le format d'affichage pour les erreurs, par exemple. HTML, JSON, XML, etc.

Les exceptions et les erreurs PHP fatales ne peuvent être évaluées qu'en mode débogage. Dans ces types de scénarios de développement, Yii peut afficher des informations détaillées sur la pile d'appels et des segments de code source. (vous pouvez le voir ci-dessus dans l'image du titre).

Les erreurs fatales sont le type d'événements qui interrompent l'exécution de l'application. Cela inclut le manque de mémoire, l'instanciation d'un objet d'une classe qui n'existe pas ou l'appel d'une fonction qui n'existe pas. 

Par exemple:

$ t = new Unknownobject ();

Commençons par quelques exemples de traitement des erreurs et des exceptions.

Configuration du traitement des erreurs et des exceptions

Premièrement, nous configurons notre application dans frontend / config / main.php. ErrorHandler est défini en tant que composant, comme indiqué ci-dessous. Cet exemple provient de l'application de démarrage de ma série, Meeting Planner. Remarquez le errorHandler configuration en Composants:

 'mp-frontend', 'name' => 'Meeting Planner', 'basePath' => dirname (__ DIR__), 'bootstrap' => ['log', '\ common \ components \ SiteHelper'], 'controllerNamespace' = > 'frontend \ controllers', 'catchAll' => [], 'composants' => ['assetManager' => […],… 'errorHandler' => ['errorAction' => 'site / error', 'maxSourceLines '=> 20,],…],]; 

Dans l'exemple ci-dessus, errorAction dirige l'utilisateur vers l'action d'erreur de mon SiteController. 

Plus largement, Yii offre une variété d’options de configuration pour errorHandler pour la redirection et la collecte de données:

Propriété Type La description
$ callStackItemView chaîne Le chemin du fichier de vue pour le rendu des exceptions et des erreurs appelle un élément de la pile. par exemple. '@ yii / views / errorHandler / callStackItem.php'
$ displayVars tableau Liste des variables PHP prédéfinies à afficher sur la page d'erreur. par exemple. ['_GET', '_POST', '_FILES', '_COOKIE', '_SESSION']
$ errorAction chaîne La route (par exemple. site / erreur) à l'action du contrôleur qui sera utilisée pour afficher les erreurs externes.
$ errorView chaîne Chemin du fichier de vue pour le rendu des exceptions sans informations sur la pile d'appels. par exemple. '@ yii / views / errorHandler / error.php'
$ exceptionView chaîne Chemin du fichier de vue pour le rendu des exceptions. par exemple. '@ yii / views / errorHandler / exception.php'
$ maxSourceLines entier Nombre maximum de lignes de code source à afficher.
$ maxTraceSourceLines entier Nombre maximal de lignes de code source de trace à afficher.
$ previousExceptionView chaîne Chemin du fichier de vue pour le rendu des exceptions précédentes. par exemple. '@ yii / views / errorHandler / previousException.php'

Utilisation de errorActions to Direct Execution

Généralement, lorsqu'un utilisateur rencontre une erreur grave, nous souhaitons le rediriger vers une page d'erreur descriptive conviviale..

C'est ce que le errorAction dans errorHandler Est-ce que. Il redirige vers l'actionError de notre SiteController:

return ['components' => ['errorHandler' => ['errorAction' => 'site / error',],]];

Dans notre SiteController, nous définissons un Erreur action:

app espace de noms \ contrôleurs; utilisez Yii; utilisez yii \ web \ Controller; La classe SiteController s'étend au contrôleur actions de fonction publique () return ['error' => ['class' => 'yii \ web \ ErrorAction',],]; 

Voici un gestionnaire d'erreur de base (vous pouvez en lire plus ici):

fonction publique actionError () $ exception = Yii :: $ app-> errorHandler-> exception; if ($ exception! == null) return $ this-> render ('error', ['exception' => $ exception]); 

Vous pouvez également répondre différemment en cas d'erreur ou si la demande de page n'existe pas dans votre application:

fonction publique actionError () $ exception = Yii :: $ app-> errorHandler-> exception; if ($ exception instanceof \ yii \ web \ NotFoundHttpException) // tous les contrôleurs non existants + les actions aboutiront ici return $ this-> render ('pnf'); // page non trouvée else return $ this-> render ('error', ['exception' => $ exception]); 

Voici mon gestionnaire d'erreur de page introuvable 404:

Vous pourriez théoriquement inclure un plan du site contenant des liens, des pages suggérées similaires à la demande de page, une fonction de recherche et un lien de support de contact sur vos pages d'erreur. Tous ces éléments peuvent aider l’utilisateur à récupérer et à progresser avec élégance..

Voici ma page d'erreur générale actuelle (évidemment j'ai des fonctionnalités à ajouter):

Catching Exceptions

Si nous voulons surveiller une section de code pour résoudre les problèmes, nous pouvons utiliser un bloc catch try PHP. Ci-dessous, nous expérimenterons en déclenchant une erreur fatale de division par zéro: 

utilisez Yii; utilisez yii \ base \ ErrorException;… try 10/0;  catch (ErrorException $ e) Yii :: warning ("Division par zéro."); … 

le capture La réponse ci-dessus consiste à générer un avertissement pour le journal. Yii a beaucoup de journalisation:

  • Yii :: trace (): enregistre un message pour suivre le fonctionnement d'un morceau de code. Principalement pour le développement.
  • Yii :: info (): enregistre un message contenant des informations sur l'événement.
  • Yii :: warning (): enregistre un message d'avertissement indiquant qu'un événement inattendu s'est produit
  • Yii :: error (): enregistre une erreur fatale pour investigation

Si, au lieu de consigner un événement, vous souhaitez diriger l'utilisateur vers la page d'erreur configurée précédemment, vous pouvez générer une exception avec l'événement:

utilisez yii \ web \ NotFoundHttpException; lancer la nouvelle NotFoundHttpException ();

Voici un exemple où nous lançons une exception avec un code de statut HTTP spécifique et un message personnalisé:

 essayez 10/0;  catch (ErrorException $ e) jette new \ yii \ web \ HttpException (451, "L’humour de Tom McFarlin est souvent perdu pour moi (et beaucoup de gens)."); 

Voici à quoi ressemble ce code pour l'utilisateur:

À propos de Yii Logging

Toutes les erreurs dans Yii sont enregistrées en fonction de la manière dont vous les avez configurées. Vous pouvez également être intéressé par mon tutoriel sur Sentry et Rollbar pour la connexion à Yii:

  • Construire votre démarrage: enregistrement des erreurs

    Trouver des erreurs de production peut s'avérer difficile sans une gestion correcte des erreurs ou un service de journalisation basé sur un nuage. J'ai essayé deux. Suivez et apprenez comment vous enregistrez…
    Jeff Reifman
    Yii

En clôture

J'espère que vous avez apprécié notre exploration de la gestion des erreurs et des exceptions. Surveillez les prochains tutoriels de notre série Programmation avec Yii2 pendant que nous continuons à plonger dans différents aspects du cadre..

Si vous souhaitez approfondir votre connaissance du développement d’applications Yii, consultez notre série Construire son démarrage avec PHP, qui utilise le modèle avancé de Yii2. Il raconte l'histoire de la programmation de chaque étape de Meeting Planner. C'est très utile si vous voulez en savoir plus sur la création d'applications dans Yii.

Si vous souhaitez savoir quand le prochain tutoriel Yii2 arrive, suivez-moi sur @lookahead_io sur Twitter ou consultez ma page d'instructeur..

Liens connexes

  • Documentation pour yii \ web \ ErrorHandler
  • Gestion des erreurs (Le guide définitif de Yii 2.0)
  • Journalisation (Le guide définitif de Yii 2.0)
  • Yii2 Developer Exchange (site de ressources de l'auteur)