Maison >développement back-end >tutoriel php >Explication détaillée de la gestion globale des erreurs en php

Explication détaillée de la gestion globale des erreurs en php

怪我咯
怪我咯original
2017-07-07 10:22:041452parcourir

php a son propre système de capture d'exceptions/erreurs try{throw{}}catch{}, qui est difficile à utiliser dans un environnement de production ; dans un environnement de production, nous exigeons généralement qu'une fois qu'une exception/erreur se produit, php immédiatement termine le script et l'affiche au visiteur Le serveur génère un message d'erreur et envoie un message à l'administrateur via fonction personnalisée

Objectif de cet article

La gestion globale des erreurs PHP est très utile lors du développement de projets. Elle peut aider les développeurs à localiser rapidement certains problèmes et à améliorer l'efficacité du travail. Par défaut, les erreurs globales seront générées directement, mais une bibliothèque-cadre récemment utilisée pendant le développement a défini une gestion globale des erreurs, ce qui entraîne la non-affichage de nombreux messages d'erreur et la localisation des problèmes prend du temps. Par conséquent, j'ai étudié l'implémentation de cette bibliothèque et j'ai découvert qu'elle définit error_reporting et set_error_handler, provoquant ce phénomène. Enregistrez maintenant l’utilisation de ces deux fonctions sous forme de mémo.

Contexte

PHP n'a pas de détection de type. Il est plus facile pour les développeurs de saisir des mots erronés, provoquant des erreurs fatales et éventuellement l'arrêt de l'exécution du script. Si vous ne recevez aucun message d’erreur à ce moment-là, ce sera très pénible. Vous devez commencer le débogage à partir de la première ligne de code du script et continuer à imprimer ou à faire écho sur des milliers de lignes de code jusqu'à ce que vous localisiez le mot mal orthographié. Ensuite, vous devez revenir en arrière et supprimer toutes les impressions ou échos précédemment ajoutés. C'est un travail extrêmement ennuyeux.

Situation générale

Dans des circonstances normales, php affichera directement l'erreur fatale et affichera la source de l'erreur (adresse du fichier, numéro de ligne) et la raison, etc. ., afin que les développeurs puissent facilement localiser les problèmes.

Mais parfois, ces informations peuvent ne pas être affichées en raison de paramètres php.ini ou de problèmes de configuration de framework tiers. À ce stade, vous devez apprendre à définir vous-même les paramètres pertinents et à afficher ces messages d'erreur. problèmes.

error_reporting

error_reporting est un paramètre de configuration global php dans php.ini. Utilisé pour configurer le niveau de sortie d'erreur. Les paramètres sont des bits, qui peuvent être utilisés pour définir le niveau de sortie d'erreur. Voici les informations copiées à partir de php.ini :

; error_reporting is a bit-field. Or each number up to get desired error
; reporting level
; E_ALL - All errors and warnings (doesn't include E_STRICT)
; E_ERROR - fatal run-time errors
; E_RECOVERABLE_ERROR - almost fatal run-time errors
; E_WARNING - run-time warnings (non-fatal errors)
; E_PARSE - compile-time parse errors
; E_NOTICE - run-time notices (these are warnings which often result
; from a bug in your code, but it's possible that it was
; intentional (e.g., using an uninitialized variable and
; relying on the fact it's automatically initialized to an
; empty string)
; E_STRICT - run-time notices, enable to have PHP suggest changes
; to your code which will ensure the best interoperability
; and forward compatibility of your code
; E_CORE_ERROR - fatal errors that occur during PHP's initial startup
; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's
; initial startup
; E_COMPILE_ERROR - fatal compile-time errors
; E_COMPILE_WARNING - compile-time warnings (non-fatal errors)
; E_USER_ERROR - user-generated error message
; E_USER_WARNING - user-generated warning message
; E_USER_NOTICE - user-generated notice message
;
; Examples:
;
; - Show all errors, except for notices and coding standards warnings
;
;error_reporting = E_ALL & ~E_NOTICE
;
; - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE | E_STRICT
;
; - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR
;
; - Show all errors except for notices and coding standards warnings
;
error_reporting = E_ALL & ~E_NOTICE


Par défaut, php affichera tous les messages d'erreur sauf avis. De même, la fonction standard PHP fournit la fonction error_reporting(int $level) du même nom, qui est utilisée pour compléter la même fonction dans les scripts PHP. Cela n'affectera pas les autres programmes. Il convient de noter que lorsque $level est égal à 0, la sortie d'erreur est désactivée, c'est-à-dire qu'aucune erreur ne sera générée.

set_error_handler

la gestion des erreurs par défaut de php consiste à afficher le message. Cependant, vous devez parfois définir d'autres opérations, auquel cas vous devez personnaliser la fonction de gestion des erreurs. PHP fournit la fonction intégrée set_error_handler pour nous aider à enregistrer nos propres fonctions de gestion des erreurs. Le prototype de la fonction est le suivant :

mixed set_error_handler ( callback $error_handler [, int $error_types = E_ALL | E_STRICT ] )

Il est à noter que même si la fonction de gestion des erreurs est enregistrée, le comportement par défaut sera toujours Lors de l'exécution, c'est-à-dire que lorsqu'une erreur se produit, le message d'erreur sera toujours affiché, vous devez donc définir explicitement le niveau d'erreur sur 0 dans le programme, puis enregistrer votre propre fonction de gestion des erreurs. Cette approche est particulièrement importante dans un environnement de production, car même en cas de problème, les informations d'erreur internes sensibles ne seront pas exposées à des utilisateurs potentiellement malveillants. Il est également important de souligner que les fonctions personnalisées de gestion des erreurs ne peuvent pas gérer les erreurs fatales (telles que les erreurs de compilation). Voici un exemple d'utilisation d'une fonction de gestion des erreurs personnalisée :

<?php
error_reporting (0);
function error_handler ($error_level, $error_message, $file, $line) {
  $EXIT = FALSE;
  switch ($error_level) {
    case E_NOTICE:
    case E_USER_NOTICE:
      $error_type = &#39;Notice&#39;;
      break;
    case E_WARNING:
    case E_USER_WARNING:
      $error_type = &#39;Warning&#39;;
      break;
    case E_ERROR:
    case E_USER_ERROR:
      $error_type = &#39;Fatal Error&#39;;
      $EXIT = TRUE;
      break;
    default:
      $error_type = &#39;Unknown&#39;;
      $EXIT = TRUE;
      break;
  }
  printf ("%s: %s in %s on line %d\n", $error_type, $error_message, $file, $line);
 
  if ($EXIT) {
    die();
  }
}
set_error_handler (&#39;error_handler&#39;);
 
//new NonExist();
echo $novar;
echo 3/0;
trigger_error (&#39;Trigger a fatal error&#39;, E_USER_ERROR);
new NonExist();
?>
L'exécution de ce script peut obtenir le résultat suivant :

Notice: Undefined variable: novar in /your/php_demo_file.php on line 40

Warning: pision by zero in /your/php_demo_file.php on line 41

Fatal Error: Trigger a fatal error in /your/php_demo_file.php on line 42
Comme vous pouvez le voir, le dernier "nouveau NoExistClass () » l'exception n'a pas été interceptée par la fonction de gestion des erreurs personnalisée.

Enfin, en passant,

set_exception_handler enregistre la gestion des exceptions de niveau supérieur dans les applications Web, vous pouvez la définir, puis accéder uniformément à la page de gestion des erreurs.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn