Si je n'attrape pas d'exception en PHP, j'obtiens un message d'erreur utile dans mon fichier error.log
Avec une trace de pile. Par exemple, si je lance:
<?php
function foo() {
throw new Exception('Oh no!');
}
foo();
?>
puis je reçois ceci écrit dans mes journaux:
[Mer 06 mars 10:35:32 2013] [erreur] [client 86.146.145.175] PHP Erreur fatale: exception non détectée 'Exception' avec le message 'Oh non!' Dans/var/www /test.php:4\nPack trace:\n # 0 /var/www/test.php(7): foo ()\n # 1 {main}\n jeté dans /var/www/test.php en ligne 4
Parfois, je voudrais attraper l'exception, mais toujours enregistrer ce détail. J'imagine quelque chose comme:
<?php
function foo() {
throw new Exception('Oh no!');
}
try {
foo();
} catch (Exception $e) {
log_exception($e);
}
?>
où log_exception
écrira dans le journal des erreurs quelque chose essentiellement dans le même format que ce qui est automatiquement écrit pour une exception non capturée - peut-être littéralement identique en plus d'avoir Caught exception
au lieu de PHP Fatal error: Uncaught exception
.
Existe-t-il une fonction intégrée pour consigner les informations d'exception comme celle-ci ou pour les capturer dans une chaîne? J'imagine quelque chose d'analogue à traceback.format_exc()
en Python.
error_log($e);
fait ce que vous voulez. Il enregistre exactement la même chose qui aurait été enregistrée si vous n'aviez pas intercepté l'exception, moins le mot "Uncaught" au début. Il le fait parce que c'est ce que la méthode magique Exception
de la classe __toString()
magic retourne.
Vous pouvez le faire dans un bloc catch
:
try {
foo();
} catch (Exception $e) {
error_log("Caught $e");
}
Ou dans le gestionnaire d'exceptions:
set_exception_handler(function($exception) {
error_log($exception);
error_page("Something went wrong!");
});
Vous pouvez utiliser les méthodes de classe de base Exception
de PHP .
Utilisez getMessage
pour obtenir le message Oh no!
et utilisez getTraceAsString
pour obtenir une trace formatée.
Nous utilisons Monolog pour effectuer la connexion dans notre application. Monolog a un formateur qui peut imprimer des traces de pile. Pour consigner les exceptions avec des traces, nous utilisons un LineFormatter et appelons includeStacktraces () dessus. (code ci-dessous)
$handler = new \Monolog\Handler\StreamHandler(STDOUT);
$lineFormatter = new \Monolog\Formatter\LineFormatter();
$lineFormatter->includeStacktraces();
$handler->setFormatter($lineFormatter);
$logger = new \Monolog\Logger('root', [$handler]);
try {
//do some throwing
} catch (Exception $e) {
//do some logging, add exception to context
$logger->error($e->getMessage(), ['exception' => $e]);
}