Dans le développement quotidien de PHP, nous rencontrons souvent des exceptions dans le programme. Afin de localiser rapidement le problème, PHP fournit une méthode très pratique de la classe d'exception : getTraceAsString () . Il formate les informations de trace de pile dans la sortie de la chaîne, aidant les développeurs à comprendre rapidement où l'erreur se produit et la chaîne d'appels.
Lorsqu'une exception est capturée, nous pouvons utiliser directement GetTraceAsString () pour obtenir des informations de pile:
<code> try {// simuler l'exception Throw New Exception ("Test Error"); } catch (exception $ e) {echo $ e-> getTraceaSString (); } </code>La sortie est similaire à ce qui suit:
#0 /var/www/html/test.php(3): throw new Exception('Erreur de test')
#1 {main}
Bien que cela fournisse déjà des informations de base, dans les applications pratiques, nous voulons souvent voir plus de contexte et même ajouter des champs personnalisés, tels que l'utilisateur actuellement connecté, l'URL demandée, les paramètres, etc., afin de localiser le problème plus rapidement.
Afin de générer un rapport d'erreur plus détaillé, nous pouvons résumer nous-mêmes une fonction de traitement des erreurs et intégrer les informations de GetTraceAsString () à d'autres informations de diagnostic. Par exemple:
<code> fonction logexceptiondetailled (exception $ e) {$ log = []; $ log [] = "time:". date ('ymd h: i: s'); $ log [] = "Message d'erreur:". $ e-> getMessage (); $ log [] = "fichier:". $ e-> getFile (). "" ". $ e-> getline ()." line "; $ log [] =" request url: http://m66.net ". $ _server ['request_uri']; $ log [] =" user ip: ". $ _server ['rote_addr']; $ log [] =" Request Paramètres: ". JSON_UNESCAPED_UNICODE); $ log [] = "Stack d'appel: \ n". file_put_contents(__DIR__ . '/error.log', implode("\n", $log) . "\n\n", FILE_APPEND);
}
</code>
Utiliser dans le programme:
<code> essayez {// Supposons que SomeriskyFunction () puisse avoir une erreur est exécutée ici; } catch (exception $ e) {logexceptionDetailled ($ e); Écho "L'erreur système s'est produite, veuillez réessayer plus tard."; } </code>De cette façon, nous enregistrons le contexte d'erreur et la pile d'appels intacts, ce qui peut mieux reproduire et analyser les problèmes même dans les environnements de production.
Dans les systèmes critiques, une fois une erreur, il peut non seulement être nécessaire d'enregistrer le journal, mais aussi d'informer les développeurs en temps réel. Vous pouvez étendre la fonction LOGExceptionDetailled ci-dessus, envoyer des e-mails ou appeler des interfaces distantes (telles que Enterprise WeChat, Dingtalk ou votre propre système de notification):
<code> fonction notifydevteam ($ message) {$ url = "https://api.m66.net/notify"; // Exemple d'interface $ data = ['msg' => $ message]; $opts = [
"http" => [
"method" => "POST",
"header" => "Content-Type: application/json",
"content" => json_encode($data)
]
];
file_get_contents($url, false, stream_context_create($opts));
}
</code>
Ajouter après journalisation:
<code> notifydevteam (implode ("\ n", $ log)); </code>Avec getTraceAsString () , nous pouvons obtenir les informations de pile d'appels de l'exception, ce qui est très utile pour le débogage. En combinant des informations contextuelles, des formats personnalisés, de la journalisation et des mécanismes de notification, un système complet de rapports d'erreurs peut être construit. Cela nous permet non seulement de connaître le problème dès que possible lorsque quelque chose ne va pas, mais améliore également considérablement l'efficacité d'inspection. Il s'agit d'une fonctionnalité qui devrait être ajoutée dans chaque projet PHP.