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:



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow