Gestionnaire d'erreurs

Mammouth du PHP | 1511 Messages

24 sept. 2006, 20:48

Bonsoir,
hier soir, je suis allé sur un site ou j'avais deux ou trois warning par page minimum.
Et je me suis posé une question,comment est-ce que on pourrait faire pour récuperer toutes les erreurs dans une page et qu'elles soient automatiquement envoyées au webmaster?
Bien sur, quand je dis erreurs, ca inclut les E_USER_ERROR, E_USER_WARNING ,E_USER_NOTICE et voir même plus.
Merci d'avance

Mammouth du PHP | 19672 Messages

24 sept. 2006, 22:49

Pour ma part, je serais tenté de te dire : prends le problème en amont, pas en aval.

Développe dans l'environnement le plus strict ne laissant passer aucune erreur, donc à priori en local configuré en E_ALL ou E_STRICT et ne mets rien en ligne tant que tout n'est pas parfaitement fonctionnel. Tu y passeras peut-être un petit peu plus de temps lors du développement de ton application, mais en comparaison par rapport au temps perdu à débugguer après-coup, ce sera un gain difficile à mesurer.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 1511 Messages

24 sept. 2006, 23:12

C'est vrai, mais bon, j'aime bien être averti des erreurs dans le genre "Impossible d'acceder a la base de données" mais dans ce cas la, je pense que ca se passe du coté de set_exception_handler() non?
@+

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

25 sept. 2006, 00:08

C'est vrai, mais bon, j'aime bien être averti des erreurs dans le genre "Impossible d'acceder a la base de données" mais dans ce cas la, je pense que ca se passe du coté de set_exception_handler() non?
@+
Pas loin, mais c'est plutôt du côté de set_error_handler qu'il faut voir en l'occurrence. Attention par contre les E_ERROR ne sont pas pris en compte. Exemple avec ce handler :
function errorName($errno)
{
    static $e_names = array(
        E_ERROR           => 'E_ERROR',
        E_WARNING         => 'E_WARNING',
        E_PARSE           => 'E_PARSE',
        E_NOTICE          => 'E_NOTICE',
        E_STRICT          => 'E_STRICT',
        E_CORE_ERROR      => 'E_CORE_ERROR',
        E_CORE_WARNING    => 'E_CORE_WARNING',
        E_COMPILE_ERROR   => 'E_COMPILE_ERROR',
        E_COMPILE_WARNING => 'E_COMPILE_WARNING',
        E_USER_ERROR      => 'E_USER_ERROR',
        E_USER_WARNING    => 'E_USER_WARNING',
        E_USER_NOTICE     => 'E_USER_NOTICE');
    return isset($e_names[$errno]) ? $e_names[$errno] : 'E_UNKNOWN';
}

function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    $errname = errorName($errno);
    $text = "$errname\n$errstr\n$errfile line $errline\n";
    echo $text;
}

set_error_handler("myErrorHandler");
Appel à mysql_connect (il n'y a ni serveur, ni extension mysql pré-chargée) :
mysql_connect("127.0.0.1");
Fatal error: Call to undefined function mysql_connect() in C:\Documents and Settings\naholyr\Bureau\error.php on line 31
Avec la bonne extension chargée (mais toujours pas de serveur) :
dl('php_mysql.dll');
mysql_connect("127.0.0.1");
E_WARNING
mysql_connect(): Can't connect to MySQL server on '127.0.0.1' (10061)
C:\Documents and Settings\naholyr\Bureau\error.php line 31
Rien ne t'empêche de récupérer quelques infos en plus, et d'envoyer ça par mail. C'est en effet un bon moyen de détecter qu'il y a eu un oubli quelque part (oubli de gérer l'erreur en question) afin de le corriger au plus vite.