PHP
Gestion des exceptions et signalement des erreurs
Recherche…
Définition du rapport d'erreurs et où les afficher
Si ce n'est pas déjà fait dans php.ini, le rapport d'erreurs peut être défini dynamiquement et doit être configuré pour permettre l'affichage de la plupart des erreurs:
Syntaxe
int error_reporting ([ int $level ] )
Exemples
// should always be used prior to 5.4
error_reporting(E_ALL);
// -1 will show every possible error, even when new levels and constants are added
// in future PHP versions. E_ALL does the same up to 5.4.
error_reporting(-1);
// without notices
error_reporting(E_ALL & ~E_NOTICE);
// only warnings and notices.
// for the sake of example, one shouldn't report only those
error_reporting(E_WARNING | E_NOTICE);
Les erreurs seront consignées par défaut par php, normalement dans un fichier error.log au même niveau que le script en cours d'exécution.
dans l'environnement de développement, on peut aussi les afficher à l'écran:
ini_set('display_errors', 1);
en production cependant, on devrait
ini_set('display_errors', 0);
et afficher un message de problème convivial à l'aide d'un gestionnaire d'exceptions ou d'erreurs.
Gestion des exceptions et des erreurs
essayer / attraper
try..catch
blocs try..catch
peuvent être utilisés pour contrôler le flux d'un programme dans lequel des exceptions peuvent être émises. Ils peuvent être attrapés et manipulés avec élégance plutôt que de laisser PHP s'arrêter quand on en rencontre un:
try {
// Do a bunch of things...
throw new Exception('My test exception!');
} catch (Exception $ex) {
// Your logic failed. What do you want to do about that? Log it:
file_put_contents('my_error_log.txt', $ex->getMessage(), FILE_APPEND);
}
L'exemple ci-dessus catch
l'exception émise dans le bloc try
et consignerait son message ("Mon exception de test!") Dans un fichier texte.
Attraper différents types d'exception
Vous pouvez implémenter plusieurs instructions catch
pour différents types d'exceptions à traiter de différentes manières, par exemple:
try {
throw new InvalidArgumentException('Argument #1 must be an integer!');
} catch (InvalidArgumentException $ex) {
var_dump('Invalid argument exception caught: ' . $ex->getMessage());
} catch (Exception $ex) {
var_dump('Standard exception caught: ' . $ex->getMessage());
}
Dans l'exemple ci-dessus, le premier catch
sera utilisé car il correspond en premier dans l'ordre d'exécution. Si vous avez échangé l'ordre des instructions catch
, le détecteur d' Exception
s'exécuterait en premier.
De même, si vous deviez lancer une Exception
UnexpectedValueException
le second gestionnaire d'une Exception
standard serait utilisé.
enfin
Si vous avez besoin de faire quelque chose après un try
ou une fin de catch
, vous pouvez utiliser une instruction finally
:
try {
throw new Exception('Hello world');
} catch (Exception $e) {
echo 'Uh oh! ' . $e->getMessage();
} finally {
echo " - I'm finished now - home time!";
}
L'exemple ci-dessus produirait les informations suivantes:
Uh oh! Bonjour tout le monde - j'ai terminé maintenant - l'heure du domicile!
jetable
En PHP 7, nous voyons l'introduction de l'interface Throwable
, qui implémente les Error
ainsi que les Exception
. Cela ajoute un niveau de contrat de service entre les exceptions en PHP 7 et vous permet d'implémenter l'interface pour vos propres exceptions personnalisées:
$handler = function(\Throwable $ex) {
$msg = "[ {$ex->getCode()} ] {$ex->getTraceAsString()}";
mail('[email protected]', $ex->getMessage(), $msg);
echo myNiceErrorMessageFunction();
};
set_exception_handler($handler);
set_error_handler($handler);
Avant PHP 7, vous pouvez simplement saisir Exception
hint, car depuis PHP 5 toutes les classes d'exception l'étendent.
Enregistrement des erreurs fatales
En PHP, une erreur fatale est une sorte d'erreur qui ne peut pas être détectée, c'est-à-dire qu'après avoir rencontré une erreur fatale, un programme ne reprend pas. Toutefois, pour consigner cette erreur ou gérer le blocage, vous pouvez utiliser register_shutdown_function
pour enregistrer le gestionnaire d'arrêt.
function fatalErrorHandler() { // Let's get last error that was fatal. $error = error_get_last(); // This is error-only handler for example purposes; no error means that // there were no error and shutdown was proper. Also ensure it will handle // only fatal errors. if (null === $error || E_ERROR != $error['type']) { return; } // Log last error to a log file. // let's naively assume that logs are in the folder inside the app folder. $logFile = fopen("./app/logs/error.log", "a+"); // Get useful info out of error. $type = $error["type"]; $file = $error["file"]; $line = $error["line"]; $message = $error["message"] fprintf( $logFile, "[%s] %s: %s in %s:%d\n", date("Y-m-d H:i:s"), $type, $message, $file, $line); fclose($logFile); } register_shutdown_function('fatalErrorHandler');
Référence:
- http://php.net/manual/en/function.register-shutdown-function.php
- http://php.net/manual/en/function.error-get-last.php
- http://php.net/manual/en/errorfunc.constants.php