TUTORIELS 
La gestion des erreurs en Php4
Bien que ne disposant pas (encore ?) d'instructions du type "try... catch", Php permet néanmoins d'intercepter les erreurs susceptibles de se produire dans un script. Principes.  (6 novembre 2001)
 

Après la gestion des exceptions en Javascript, nous examinons aujourd'hui comment traiter au mieux une erreur susceptible de survenir lors de l'exécution d'un script Php. Notez que ces erreurs ne sont pas toutes de la même importance, allant du simple "warning" concernant une variable non définie, à l'erreur fatale interrompant le script. Mais il toujours préférable de détecter les problèmes éventuels, quels qu'ils soient, et ce le plus rapidement possible.

Passer outre les fichiers non trouvés

Avant de nous focaliser sur les erreurs de script, voyons très rapidement comment gérer un message d'erreur du type "HTTP 404 : Fichier non trouvé".
Si votre site tourne sous Apache, il suffit de placer un fichier nommé ".htaccess" à sa racine et d'y écrire :

(Mise à jour du 28/01/2002, le " / " avait été oublié).
ErrorDocument 404 /error.php

Si un internaute tente de se connecter à une page inexistante de votre site, il sera redirigé vers la page "error.php". Vous pouvez alors inclure dans celle-ci un traitement Php qui vous prévienne par email quand cette situation se produit. Selon la version d'Apache que vous possédez, vous pourrez également prendre connaissance de l'URL qui a causé cette erreur :

(error.php)
L'URL demandée (<?=$REDIRECT_URL?>) n'existe pas.

"REDIRECT_URL" est une variable définie par Apache lorsque celui-ci rencontre une directive de type "ErrorDocument".

Maintenant que vos visiteurs sont pris en charge en cas de page non trouvée, il convient désormais de leur épargner les éventuelles erreurs qui pourraient se produire sur vos scripts.

Nous allons ici détailler les fonctions disponibles sous Php4, mais sachez que la notion de gestion des erreurs ("Error Handling") n'est pas absente de Php3. Le nombre de fonctions supportées est toutefois moindre.

Les moyens disponibles

Php permet d'intercepter tous les messages d'erreur afin de les personnaliser si besoin. Au total onze fonctions sont disponibles, huit d'entre elles permettent de classifier (origine probable, gravité) le type d'erreur rencontré par Php, et trois autres permettent au programmeur de définir ses propres erreurs.

Si ces erreurs ne font pas toutes l'objet d'un message d'erreur de la part de Php, il est bon de connaître leur existence. Vous pourrez alors choisir éventuellement de les afficher grâce à la fonction "error_reporting()". Par défaut en Php3 et Php4, seules les erreurs de type E_ERROR, E_WARNING, et E_PARSE, sont affichées.

Parmi les huit types d'erreurs standards, on trouve :

- E_ERROR : Ce type représente une erreur fatale. Le script se termine. Ce genre d'erreurs est affiché par défaut par Php.

- E_WARNING : Concerne une erreur qui n'est pas fatale au script. Elle peut-être issue par une fonction php qui reçoit un mauvais type de données en entrée par exemple. Ce type d'erreur est affiché par défaut en Php.

- E_PARSE : Typique de l'erreur de syntaxe, ce type d'erreur est généré par le parseur Php. L'exécution du script est stoppée.

- E_NOTICE : Moins grave qu'un E_WARNING, ce type d'erreur peut néanmoins s'ggraver lors de l'exécution du script. Non affiché par défaut, il est tout de même utile d'aller rechercher la variable non définie par exemple.

- E_CORE_ERROR, E_CORE_WARNING : Ces deux types d'erreurs peuvent survenir lors du démarrage initial de Php.

- E_COMPILE_ERROR, E_COMPILE_WARNING : Là encore, ce sont deux types d'erreurs qui sont susceptibles de survenir lors de la compilation de Php.

Nous avons épuisés les types d'erreur standards de Php, voyons maintenant les moyens qui nous sont offerts pour définir nos propres types :

- E_USER_ERROR : Le type d'erreur le plus sévère que nous puissions définir. Il se doit d'être employé dans des situations semblables à celles concernant E_ERROR, une division par zéro par exemple.

- E_USER_WARNING : L'exécution du script n'est pas interrompue mais ce type d'erreurs doit être résolu. De même que E_WARNING, il peut concerner des erreurs de type importantes.

- E_USER_NOTICE : Même comportement que E_NOTICE du côté des types d'erreurs personnalisables.

Exemple d'implémentation

Si vous souhaitez mettre ce type de gestion d'erreurs en place sur votre site, inspirez-vous pourquoi pas de l'exemple suivant, tiré du manuel Php.

<?
define (FATAL,E_USER_ERROR);
define (ERROR,E_USER_WARNING);
define (WARNING,E_USER_NOTICE);

// On définit le niveau d'erreur souhaité
error_reporting (FATAL | ERROR | WARNING);

// La fonction principale
function myErrorHandler ($errno, $errstr, $errfile, $errline)
{
     switch ($errno)
     {
          case FATAL:
          echo "<b>FATAL</b> [$errno] $errstr<br>\n";
          echo " Fatal error in line ".$errline." of file ".$errfile;
          echo ", PHP ".PHP_VERSION." (".PHP_OS.")<br>\n";
          echo "Aborting...<br>\n";
          exit -1;
          break;

         case ERROR:
         echo "<b>ERROR</b> [$errno] $errstr<br>\n";
         break;

         case WARNING:
         echo "<b>WARNING</b> [$errno] $errstr<br>\n";
         break;

        default:
        echo "Unkown error type: [$errno] $errstr<br>\n";
        break;
    }
}

// Jeu de test
function scale_by_log ($vect, $scale)
{
     if ( !is_numeric($scale) || $scale <= 0 )
          trigger_error("log(x) for x <= 0 is undefined, you used: scale = $scale", FATAL);
     if (!is_array($vect))
     {
          trigger_error("Incorrect input vector, array of values expected", ERROR);
          return null;
     }
     for ($i=0; $i<count($vect); $i++)
     {
          if (!is_numeric($vect[$i]))
              trigger_error("Value at position $i is not a number, using 0 (zero)", WARNING);
         $temp[$i] = log($scale) * $vect[$i];
     }
     return $temp;
}

// Permet de remplacer la gestion des erreurs php par défaut par notre fonction
$old_error_handler = set_error_handler("myErrorHandler");

// on genere une erreur : tous les champs du tableau ne sont pas numeriques
echo "vector a\n";
$a = array(2,3,"foo",5.5,43.3,21.11);
print_r($a);

// mise en place d'un "warning'"
echo "----\nvector b - a warning (b = log(PI) * a)\n";
$b = scale_by_log($a, M_PI);
print_r($b);

// on passe une chaine au lieu d'un tableau
echo "----\nvector c - an error\n";
$c = scale_by_log("not array",2.3);
var_dump($c);

// erreur fatale : division par zero.
echo "----\nvector d - fatal error\n";
$d = scale_by_log($a, -2.5);
?>

Seuls les principes de la gestion d'erreurs ont été évoqués ici, mais pour davantage d'informations sur le sujet, vous pouvez consulter le manuel Php à la rubrique "Error Handling", ou cet autre article sur le site de Zend (auteurs du moteur d'exécution des scripts dans Php4), ou encore la documentation Php.

 
[ Arnaud GadalJDNet
 
Accueil | Haut de page