Dynamic-Mess.com


"The world is a dynamic mess of jiggling things..."

PHP : Erreurs et Exceptions

Article posté le 02-01-2014 dans la catégorie PHP

Pour créer un site de qualité, il est important de bien gérer ses erreurs (afin d'éviter d'avoir l'horrible message "WARNING"), mais également les exceptions, afin de pouvoir continuer l'exécution de script et de pouvoir présenter une page tenant compte de cette erreur.

Avant de commencer 

Une chose simple à connaître. Quand vous faites un try-catch, vous verrez plus bas, vous devez savoir que vous pouvez afficher ce que vous voulez dans le bloc catch.

Cependant, vous pouvez aussi choisir d'afficher en plus le message d'erreur, mais également de choisir de stopper ou continuer le script malgré l'erreur.

Pour afficher l'erreur, vous pouver utiliser :

print_r($exception);

Pour stopper le script, vous utiliser:

die();

Les deux peuvent être combinées:

die(print_r($exception));

 

1- Gérer les exceptions

L'important pour un code de qualité est d'attraper les exceptions, pour que le code continue à s'exécuter, et de bien les gerer, pour éviter les horribles messages d'erreurs. Pour cela nous créons une instance de la classe Exception. Cependant, celle-ci permet d'utiliser plusieurs paramètres optionnels, comme le message d'erreur, l'affichage du code fautif...

2- Exemple basique

Soit ce petit module pour calculer la différence entre deux nombres. Pour que l'opération soit réalisable, il faut que les deux varibles soient numériques :

function soustraire($a, $b)
{
  if (!is_numeric($a) OR !is_numeric($b)) // Erreur : on lance l'exception :
  {
    throw new Exception('Les deux valeur en paramètre doivent être de type numérique !');
  }
  return $a + $b; // Dans le cas où tout est ok, on fait le calcul
}
try // Tentative d'exécuter le code suivant
{
  echo soustraire(8, 4); //Ok
 echo soustraire(8, "bc"); // Erreur
}
catch (Exception $e) // Gestion des exceptions de type Exception
{
  echo 'Nous avons une erreur. Message d'erreur : ', $e->getMessage();
//getMessage() permet d'afficher le message d'erreur spécifié dans la fonction de calcul avec le "throw new Exception"
//Note : la fonction getCode() permet d'afficher le code fautif
}

PHP permet de créer ses propres classes d'exception qui héritent de la classe Exception. Vous ne pouvez réécrire que les fonctions __contruct et __toString() Les autres, comme getMessage() ou getFile() sont déclarées final et ne peuvent être modifiées.

3- Exceptions spécialisées

PHP gère nativement des exceptions pour plusieurs cas de figure, la liste complète étant disponible.

Par exemple, afin de faire un code plus clair et plus adapté, notamment dans le cas où vous utilisieriez plusieurs blocs catch...

Dans notre exemple précédent, nous aurions lors du lancement de l'exception :

throw new InvalidArgumentException('Les deux valeur en paramètre doivent être de type numérique !');

avec le catch approprié...

Il est très IMPORTANT de s'en servir d'un point de vue loqique et qualitatif!

4- Convertir une erreur en exception

Les messages de type warning sont également très laids, et afin de les gérer au mieux d'un point de vue qualité du code, il est possible de les convertir en exception :

Avant le début de votre bloc try-catch, appelez cette fonction, en lui passant en paramètre le nom d'une fonction que nous allons utiliser :

set_error_handler('exceptions_error_handler'); //conversion
Note: si vous utilisez une méthode d'une classe plutôt qu'une fonction:
set_error_handler([CustomExceptionHandler::class, 'exceptions_error_handler']);

Méthode ou fonction que l'on definit :

class CustomExceptionHandler
{
    /**
     * Custom error handler.
     * Can be used to catch warnings.
     * Example of utilization :
     *
     * set_error_handler([CustomExceptionHandler::class, 'exceptions_error_handler']);
     * ... (do you stuff here)
     * restore_error_handler();
     *
     *
     * @param $severity
     * @param $message
     * @throws Exception
     */
    public static function exceptions_error_handler($severity, $message)
    {
        if (error_reporting() == 0) {
            return;
        }
        if (error_reporting() & $severity) {
            throw new Exception($message);
        }
    }

}

Vous n'êtes pas obligé de définir ce handler pour toute votre application. Vous pouvez le faire si vous le désirez que pour un morceau bien défini pour ensuite revenir au fonctionnement "normal":

set_error_handler([CustomExceptionHandler::class, 'exceptions_error_handler']);
// Votre traitement ici
restore_error_handler(); // Retour au fonctionnement normal

5- Cas des erreurs non connues

Suite à la partie précédente, il est interessant de pouvoir personnaliser les exceptions non attrapées :

set_exception_handler('exceptionPerso'); //Fonction en paramètre

Fonction que l'on définit :

function exceptionPerso($e)
{
  echo 'Erreur à la ligne ', $e->getLine(), ' dans le fichier ', $e->getFile(), '
Une exception a été lancée : ', $e->getMessage();
}

 

 

 


Tweet
comments powered by Disqus