annuaire
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
- ArithmeticError
- Exception
- ...
- Erreur
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 )
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_handler
gestionnaire 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_types
Spé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 deexit()
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'erreurPlainTextHandler
- message texte brut lorsqu'un programme de ligne de commandeCallbackHandler
- la fermeture de l'emballage ou tout autre gestionnaire d'appelsJsonResponseHandler
- intercepte l'exception et retourne la chaîne JSON, comme une demande d'AJAXXmlResponseHandler
- 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 message
PHP 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 message
Paramètre envoyé auxdestination
paramètres d'adresse de messagerie. Le quatrième paramètreextra_headers
ne sera utilisé dans ce type là.2 Il n'est plus une option. 3 message
Il est envoyé à l'emplacementdestination
du fichier. Caractèremessage
ne 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
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(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_handler
capturé, 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_signal
alors le signal de capture dans lequel l'appel exit()
de suspendre la normale.
Article tiré à part https://www.cnblogs.com/youjiaxing/p/10310658.html