Maison  >  Article  >  développement back-end  >  Analyser la gestion des erreurs PHP (fonctionnalité principale)

Analyser la gestion des erreurs PHP (fonctionnalité principale)

藏色散人
藏色散人avant
2020-01-26 13:35:402029parcourir

Analyser la gestion des erreurs PHP (fonctionnalité principale)

Erreurs et exceptions

Les erreurs peuvent comprendre les erreurs dans le programme lui-même, telles que les erreurs de syntaxe. Les exceptions ont tendance à se produire lorsque le programme ne s'exécute pas comme prévu ou n'est pas conforme au processus normal ; pour le langage PHP, les mécanismes utilisés pour gérer les erreurs et les exceptions sont complètement différents, il est donc facile de semer la confusion.

Par exemple, nous voulons gérer le cas de division par 0 en interceptant l'exception, mais avant que l'exception ne soit interceptée, PHP déclenche une erreur.

try {
    $a = 5 / 0;
} catch (Exception $e) {
    $e->getMessage();
    $a = -1;  // 通过异常来处理 $a 为 0 的情况,但是实际上,捕获不到该异常
}

echo $a;
// PHP Warning:  Division by zero

En d'autres termes, PHP déclenche le cas de division par 0 comme une erreur, et ne lève pas automatiquement d'exception, elle ne peut donc pas être interceptée. De même, dans de nombreux cas, PHP ne peut pas automatiquement lever d'exceptions. Les exceptions ne peuvent être levées que manuellement via des instructions if-else et combinées avec la méthode throw.

La situation ci-dessus se produit principalement parce que le mécanisme d'exception est le produit de l'évolution de PHP vers l'orientation objet. Avant cela, le rapport d'erreurs PHP se faisait principalement via le mécanisme d'erreur. Par conséquent, dans de nombreux cas, les erreurs PHP ont plus de valeur que les exceptions. Cependant, PHP7 commence à unifier les deux, permettant de générer des erreurs comme des exceptions (cette partie sera expliquée dans la section exceptions).

Niveau d'erreur

Les erreurs en PHP peuvent être comprises comme des situations qui empêchent le bon fonctionnement du script et peuvent être déterminées de haut en bas selon le niveau d'erreur. Divisé en cinq catégories

1 Parse error ou Syntax Error - erreur d'analyse de syntaxe, lorsque l'erreur est déclenchée, le script ne peut pas s'exécuter du tout

2. . Fatal Error - erreur fatale, déclenchée Après cette erreur, les scripts suivants ne peuvent pas continuer à s'exécuter

3.Warning Error - Si quelque chose d'inapproprié se produit, le script peut continuer à s'exécuter ; 4.

- Si quelque chose d'inapproprié se produit, mais que le degré est inférieur à l'erreur d'avertissement, le script peut continuer à s'exécuter

Notice Error5.

- Ceci n'est pas recommandé et peut être abandonné dans le à l'avenir, le script peut continuer à s'exécuter ;

Deprecated ErrorPar défaut, PHP déclenche une erreur et affiche le niveau d'erreur et l'invite correspondante.

Exemple - N'écrivez pas de point-virgule à la fin de l'instruction

 echo "abc"
// PHP Parse error:  syntax error, unexpected end of file, expecting ',' or ';
Parse Error

Exemple - Utiliser une fonction inexistante

 echo "before\n";
 foo();
 echo "after"; // 本行无法继续执行
 // before
 // PHP Fatal error:  Uncaught Error: Call to undefined function foo()
Fatal Error

Exemple d'erreur d'avertissement - Introduction d'un fichier inexistant

$a = "foo";
include('bar.php');
echo $a; // 程序继续执行
// PHP Warning:  include(bar.php): failed to open stream: No such file or directory ...
// foo
Notice Error 示例 - 输出不存在的变量

echo $foo;
echo 12345;
// PHP Notice:  Undefined variable: foo
// 12345

Exemple - Passage de nombres au lieu de chaînes dans certaines fonctions de chaîne

 strpos('12345', 3);
 // PHP Deprecated:  strpos(): Non-string needles will be interpreted as strings in the future
Deprecated Error

En plus du message déclencheur par défaut, les utilisateurs peuvent également utiliser la fonction set_error_handler pour personnaliser la gestion des erreurs. La plupart des types d'erreurs peuvent être personnalisés, à l'exception de

,

, E_ERROR, <.> , E_PARSE, E_CORE_ERROR dehors. E_CORE_WARNING

 set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed
E_COMPILE_ERROR E_COMPILE_WARNING

Exemple

<?php
// E_ALL - 处理全部错误类型
set_error_handler(&#39;customError&#39;, E_ALL);

/**
 * @param  int $errno 错误的级别
 * @param  string $errstr  错误的信息
 * @param  string $errfile 错误的文件名(可选)
 * @param  string $errline 错误发生的行号(可选)
 */
function customError(int $errno, string $errstr, string $errfile, string $errline)
{
    echo sprintf(&#39;错误消息为 %s&#39;, $errstr);
}

$a = 5 / 0;  // 错误消息为 Division by zero

Les utilisateurs peuvent également déclencher manuellement une erreur au niveau de l'utilisateur (E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE, E_USER_DEPRECATED) via la fonction trigger_error .

function division($a, $b) {
    if($b == 0){
        @trigger_error("0 不能作为除数", E_USER_NOTICE);
        return -1;
    }
    return $a / $b;
}

echo division(10, 0);

Configurations liées aux erreurs

Quelques configurations courantes liées à la gestion des erreurs

Quantity

- Définir le niveau de rapport d'erreurs

error_reporting - S'il faut afficher les erreurs

display_errors - S'il faut afficher l'affichage au démarrage de PHP

display_startup_error -Définissez s'il faut enregistrer les informations d'erreur du script en cours d'exécution dans le journal des erreurs du serveur ou error_log

"Modern PHP" propose quatre règleslog_errors

● Assurez-vous de laisser PHP signaler les erreurs ;

● Les erreurs doivent être affichées dans l'environnement de développement;

● Les erreurs ne peuvent pas être affichées dans l'environnement de production

● Les erreurs doivent être enregistrées à la fois dans l'environnement de développement et dans la production ; environnement ;

Configuration recommandée pour l'environnement de développement

 display_errors = On
 display_startup_error = On
 error_reporting = -1
 log_errors = On

Configuration recommandée pour l'environnement de production

display_errors = Off
display_startup_error = Off
; 报告 Notice 以外的所有错误
error_reporting = E_ALL & ~E_NOTICE
log_errors = On

Standards de codage Symfony Related

Les chaînes de messages d'exception et d'erreur doivent être fusionnées à l'aide de ;

sprintf lancer une nouvelle CommandNotFoundException(sprintf('Command "%s" n'existe pas. ', $name)) ;

Lorsque le type d'erreur est

, vous devez ajouter

E_USER_DEPRECATED@@trigger_error("foo", E_USER_DEPRECATED) ;

Pour plus de connaissances sur php, veuillez visiter le

tutoriel php
 !

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer