la gestion des erreurs d'exception PHP

Erreurs et exceptions

Les erreurs et les anomalies ne sont pas les mêmes en PHP, ils indiquent un problème avec le code, et peut fournir un message d'erreur.

Points:

  • Erreur des occasions se présentent plus tôt que anormale
  • Erreur peut être déléguée à un processus de gestionnaire d'erreur global, certaines erreurs ne peuvent pas être récupérées, il provoquera le script d'arrêt
  • Anormale première instanciation (Exception classe), lance alors, il peut être capturé (try ... catch)
  • Anormale après la capture peut être traité in situ, sans arrêter le script (Toute exception UNCAUGHT_EXCEPTION provoque le script d'arrêt)

L'utilisation des exceptions:

  • Initiative: face à la situation irréparable (le contexte actuel ne savent pas comment faire face à) l'initiative jeté, remis au processus utilisateur

    par exemple. le délai de connexion de base de données, le type de paramètre entrant ne satisfait pas aux conditions.

    par exemple., et les composants du cadre sont particulièrement incapables de déterminer comment traiter la condition anormale, jette généralement une exception, appelée aux utilisateurs spécifiques à traiter.

  • La défense passive: prédire les problèmes potentiels, atténuer les effets (susceptibles de jeter un code d'exception dans le bloc try / catch)

PHP 7 Remarque :

En PHP 7, la plupart des erreurs sont comme exception d'erreur est lancé, il peut être capturé.

Si vous ne soyez pas pris et ne pas enregistrer un gestionnaire d'exception (par set_exception_handler () inscription), sera de la manière traditionnelle (voir version précédente PHP7): est rapporté comme une erreur fatale (erreur fatale), peut être le traitement set_error_handler ().

exception classe

PHP intégré exceptions catégories:

étendue classe d'exception SPL (Hériter de la classe d'exception):

Classe d'erreur (PHP> = 7)

  • throwable
    • Erreur
      • ArithmeticError
        • DivisionByZeroError
      • AssertionError
      • Erreur d'analyse
      • Erreur-type
    • Exception
      • ...

Note: En PHP 7, erreur et exception sont héritées de Throwable, alors quand capturé (try ... catch) peuvent simultanément des exceptions de capture et d' erreurs en capturant Throwable à

try {
    // do something
} catch (\Throwable $e) {
    // log error or sth.
}

erreur

php peut déclencher différents types d'erreurs:

  • erreur fatale
  • erreur d'exécution
  • erreur de compilation
  • Erreurs de démarrage
  • L'utilisateur déclenche une erreur (rare)

Signaler une erreur Niveau

error_reporting(int $level);

PHP 5.3 et au- dessus, le niveau de rapport d'erreur par défaut est E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED(ne sera pas affiché E_NOTICE , E_STRICT , E_DEPRECATED )

Manuel PHP Tous les niveaux d'erreur

Une partie de l'explication du niveau d'erreur:

Niveau d'erreur explication proposition
E_NOTICE exécution de notification. Il indique que le script rencontré peut se manifester comme une erreur, mais le script en cours d'exécution à l'intérieur il peut y avoir un avis similaire. Utilisation au cours du développement, bogue dans le code qui pourrait survenir sera un avertissement, de gagner du temps de débogage
E_STRICT Activer PHP modifications proposées au code, le code doit assurer la meilleure interopérabilité et compatibilité.
E_ALL ne comprend pas E_STRICT, de sorte que le défaut ne soit pas activée
Utilisation au cours du développement
E_DEPRECATED exécution de notification. Sera le code activé peut ne pas fonctionner dans les versions futures d'avertissement. ouvert

Signaler une erreur

Signaler une erreur suivre le principe de

  • Pour signaler une erreur
  • Environnement de développement pour afficher une erreur
  • Environnement de production pour ne pas afficher d' erreur (raisons de sécurité)
  • Développement et de production doivent enregistrer les erreurs

Remarque distinguer les erreurs du rapport et des erreurs montrent la différence entre ces deux concepts.

php.ini

Environnement de développement est le rapport d'erreurs recommandé

;显示错误
display_startup_errors = On
display_errors = On

; Signaler les erreurs
error_reporting = - 1

; Erreur d' enregistrement
log_errors = le sur

Environnement de production est le rapport d'erreurs recommandé

;显示错误
display_startup_errors = Off
display_errors = Off

; Rapport d' erreur
du error_reporting = E_ALL & ~ E_NOTICE

; Erreur d' enregistrement
log_errors = le sur

Certains paramètres pour expliquer

paramètres explication proposition
display_errors Si l'information d'erreur est fournie dans le cadre de la sortie à l'écran ou masqué à l'utilisateur sans afficher Environnement de développement ouvre
un environnement de production Assurez - vous de désactiver
display_startup_errors Même si display_errors est réglé sur ON, les messages d'erreur PHP au démarrage ne seront pas affichés. Il est fortement recommandé sauf à des fins de débogage, les display_startup_errors désactivé. Environnement de développement ouvre
un environnement de production Assurez - vous de désactiver
log_errors Est configuré pour exécuter un message d'erreur de script est enregistré dans le journal ou d'erreur du serveur error_log dans ouvert

Exemple de code

<?php
// 关闭所有PHP错误报告
error_reporting(0);
// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// 报告 E_NOTICE也挺好 (报告未初始化的变量
// 或者捕获变量名的错误拼写)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
// 除了 E_NOTICE,报告其他所有错误
error_reporting(E_ALL ^ E_NOTICE);
// 报告所有 PHP 错误 (参见 changelog)
error_reporting(E_ALL);
// 报告所有 PHP 错误
error_reporting(-1);
// 和 error_reporting(E_ALL); 一样
ini_set('error_reporting', E_ALL);
?>

gestionnaire global d'exception

Attrapez toutes exception uncaught: par set_exception_handlergestionnaire d'exception globale enregistrée.

fonction

set_exception_handler ( callable $exception_handler ) : callable
// 注册异常处理程序
set_exception_handler('handleException');
// 重置异常处理程序为默认值
// set_exception_handler(null);
// 还原成之前的异常处理程序
// restore_exception_handler();    
// < PHP 7
handleException(Exception $ex)
{
    // 记录错误日志
    echo "Uncaught exception: " , $ex->getMessage(), "\n";
    // 开发环境显示调试信息(推荐 filp/whoops 扩展包)
    // ...
    // 生产环境显示对用户友好的页面(信息)
    // ...
}
// >= PHP 7
// 大多数错误抛出 Error 异常, 也能被捕获, 因此参数类型必须是 Throwable, 否则会引起问题.
handleException(Throwable $ex)
{
    // ...
}

Dans l'exception définie par l'utilisateur des fonctions internes de manipulation, vous pouvez faire un traitement selon la situation:

  • Enregistrement d'erreur
  • erreurs de page Web de rendu
  • erreur de rendu console

gestionnaire d'erreur global

En définissant un gestionnaire d'erreur global, utiliser leur propre façon personnalisée à des erreurs d'interception et de PHP processus, y compris mais sans s'y limiter:

  • journal des erreurs Notice détaillée
  • Faites nettoyer la récupération des données / fichiers
  • ErrorException transformé en un objet, puis le flux de l'exception de traitement des erreurs de poignée.

Inscrivez-vous gestionnaire d'erreur global

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

$error_typesSpécifiez le type d'erreur serait d' intercepter le gestionnaire d'erreurs (sauf si la fonction retourne false), ne sont pas error_report()affectées.

maître

# 错误处理函数参数
# $errno 错误等级(对应 E_* 常量)
# $errstr 错误消息
# $errfile 发生错误的文件名
# $errline 发生错误的行号
# $errcontext 一个数组, 指向错误发生时可用的符号表(可选参数), 通常不用(php7.2后废弃)
function error_handler(int $errno, string $errstr, string $errfile, int $errline, array $errcontext) {
    // 处理错误
}

Lorsque l'instruction est préfixé par @ erreur se produit, $ errno est 0

  • Le script continue du mauvais endroit à la fin de la fonction de gestion des erreurs (et doivent donc prendre l'initiative d'appel, le cas échéant, die()ou de exit()mettre fin au script)

  • Si une erreur se produit avant l'exécution du script (tel que le téléchargement de fichiers) n'est pas appelé gestionnaire d'erreur personnalisé, car il n'est pas enregistré à ce moment-là.
  • Si la fonction donne FALSE , programme de traitement d'erreur standard continuera à appeler.

Le type d'erreur ne peut pas être capturé

Les niveaux d'erreur suivantes ne peuvent pas être saisies par un gestionnaire d'erreurs définie par l'utilisateur:

Niveau d'erreur explication
E_ERROR erreurs d'exécution fatale, généralement irrécupérables (problèmes, par exemple. En raison de l'allocation de mémoire)
E_PARSE Des erreurs d'analyse au moment de la compilation, générés par l'analyseur
E_CORE_ERROR initial erreur fatale se produit lors de démarrage PHP généré par le moteur php noyau
E_CORE_WARNING avertissements de démarrage initial PHP (erreurs non fatales) qui se produisent au cours généré par le moteur php noyau
E_COMPILE_ERROR Les erreurs fatales au moment de la compilation. De même E_ERROR , mais il est généré par le moteur Zend.
E_COMPILE_WARNING Mises en garde (erreurs non mortelles) au moment de la compilation. De même E_WARNING , mais est généré par le moteur Zend.

Et d' appeler  set_error_handler () La  plupart du fichier dans lequel la fonction générée  E_STRICT .

Ces erreurs ne peuvent pas être capturées peuvent être register_shutdown_function()traitées (mais le script fin encore)

Exemple de code

function handleError($errno, $errstr, $errfile = '', $errline = 0)
{
    if (!(error_reporting() & $errno)) {
        // 错误类型未包含在 error_reporting() 里, 因此将它交由PHP标准错误处理程序来处理
        return false;
    }
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}

L' erreur est convertie en une exception

environnements de développement / production Gestion des erreurs et exceptions

environnement de développement

php défaut message d'erreur est très mauvais, afin de mieux aider le débogueur, vous pouvez utiliser filp / whoops pack d'extension.

installer

composer require filp/whoops

Utilisation (web)

$whoops = new \Whoops\Run;
$whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler);
$whoops->register();

Si déclencheur de script php erreurs PHP, ou l'application ne coincent pas des exceptions, le développeur peut voir une Whoops page de diagnostic graphiques.

processeur disponible

  • PrettyPageHandler - bel affichage de la page Web affiche un message d'erreur
  • PlainTextHandler - message texte brut lorsqu'un programme de ligne de commande
  • CallbackHandler - la fermeture de l'emballage ou tout autre gestionnaire d'appels
  • JsonResponseHandler - intercepte l'exception et retourne la chaîne JSON, comme une demande d'AJAX
  • XmlResponseHandler - attraper l'exception, mais il est revenu dans la chaîne de format XML

Environnement de production

informations d'erreur d' enregistrement est généralement utilisé la error_log()fonction pour enregistrer le message d'erreur au système de fichiers ou syslog.

error_log ( string $message [, int $message_type = 0 [, string $destination [, string $extra_headers ]]] ) : bool

message_type doivent être envoyées à l' endroit où le paramètre erreurs de réglage. types d'informations possibles sont les suivantes:

0 messagePHP est envoyé au journal du système, utilisez le mécanisme de journalisation du système d'exploitation ou d' un fichier, en fonction des error_log directive fixe quoi. Ceci est l'option par défaut.
1 messageParamètre envoyé aux destinationparamètres d'adresse de messagerie. Le quatrième paramètre extra_headersne sera utilisé dans ce type là.
2 Il n'est plus une option.
3 messageIl est envoyé à l'emplacement destinationdu fichier. Caractère messagene fait pas défaut à traiter comme une nouvelle ligne.
4 message SAPI envoyé directement à un gestionnaire de journal.

Une meilleure option consiste à utiliser monolog / monolog package étendu

<?php
require "vendor/autoload.php";
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
// create a log channel
$log = new Logger('name');
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));
// add records to the log
$log->warning('Foo');
$log->error('Bar');

Exemple: l'exploitation forestière dans Monologue un environnement de production, un mail de notification d'erreur grave

依赖: swiftmailer / swiftmailer

require "vendor/autoload.php";
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\SwiftMailerHandler;
date_default_timezone_set('Asia/Shanghai');
// 设置monolog
$logger = new Logger('my-app-name');
$logger->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));
// 添加SwiftMailer Handler, 遇到严重错误时使用邮件通知
// Create the Transport
$transport = (new Swift_SmtpTransport('smtp.example.org', 25))
  ->setUsername('your username')
  ->setPassword('your password');
// Create the Mailer using your created Transport
$mailer = new Swift_Mailer($transport);
// Create a message
$message = (new Swift_Message('Wonderful Subject'))
  ->setFrom(['[email protected]' => 'John Doe'])
  ->setTo(['[email protected]', '[email protected]' => 'A name']);
$logger->pushHandler(new SwiftMailerHandler($mailer, $message, Logger::CRITICAL));
// 使用日志记录器
$logger->critical('The server is on fire!');

La fonction de Php est annulée

register_shutdown_function

register_shutdown_function(function () {
    // do sth...
}, $para1, $param2, ...)

Une inscription callback, il exécutera le script pour terminer ou sortie () après l'appel.

Remarque:

  • Peut enregistrer plusieurs callbacks (pas écraser les uns des autres, afin d'appeler conformément à l'ordre d'inscription), lorsque le script php est appelé à faire avorter.

  • Si vous appelez les méthodes internes enregistrées sortie () , puis tout le traitement est interrompu, et ne sera plus appelé la suspension d'autres callbacks enregistrés.

Dans le cadre de l'erreur ne peut pas être set_error_handlercapturé, et ont donc besoin de coopérer register_shutdown_function, afin de déterminer la cause des sorties de script, parce que si une erreur fatale n'est pas pris, vous devrez traiter (exploitation forestière, etc.)

register_shutdown_function('handleShutdown');
function handleShutdown()
{
    // 如果是因为严重错误(未被捕获)导致脚本退出, 则需要处理(作为对 set_error_handler的补充)
    if (! is_null($error = error_get_last()) && isFatal($error['type'])) {
        // handleException() 函数同时处理 set_exception_handler
        handleException(new \ErrorException(
            $error['message'], $error['type'], 0, $error['file'], $error['line'],
        ));
    }
}
function isFatal($type)
{
    // 以下错误无法被 set_error_handler 捕获: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING
    return in_array($type, [E_COMPILE_ERROR, E_CORE_ERROR, E_ERROR, E_PARSE]);
}

Remarque:

Processus fonction avortée ne sera pas appelée lorsque le signal SIGTERM ou tuer SIGKILL. Peut pcntl_signalalors le signal de capture dans lequel l'appel exit()de suspendre la normale.

Article tiré à part https://www.cnblogs.com/youjiaxing/p/10310658.html

Publié 41 articles originaux · louange gagné 21 · vues 70000 +

Je suppose que tu aimes

Origine blog.csdn.net/u010324331/article/details/89565154
conseillé
Classement