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.
|