IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Exceptions et PHP5

Exceptions et PHP5


prcdentsommairesuivant

IV. Amlioration du systme d'exception

IV-A. Capture automatique des exceptions

La prsence de la gestion des exceptions dans certaines extensions de PHP, gnralement non utilise car non connue des dveloppeurs, ainsi que les possibles risques d'avoir un throw gar dans les profondeurs d'une classe impliquent que certaines exceptions souleves peuvent ne pas tre attrapes. Nous obtenons alors un message peu agrable de la sorte :

 
Sélectionnez

Fatal error: Uncaught exception 'Exception' with message 'Message non captur' 
in C:\wamp\www\exception\index.php:4 
Stack trace: #0 C:\wamp\www\exception\index.php(7): showUncaughtException() #1 {main} 
thrown in C:\wamp\www\exception\index.php on line 4

Dans le cas de PDO par exemple, une exception non gre affiche toute la chane de connexion incluant les donnes de connexion la base de donnes.

 
Sélectionnez

Exception de connexion  la BDD avec PDO a crit :
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000] [1049] 
Unknown database 'jeu_de_role'' in 
c:\program files\apache group\www\dvp\tests\pdo.php:22 
Stack trace: #0 c:\program files\apache group\www\dvp\tests\pdo.php(22): 
PDO->__construct('mysql:host=loca...', 'root', '1234', Array) #1 {main} 
thrown in c:\program files\apache group\www\dvp\tests\pdo.php on line 22

Pour remdier ce problme vident, PHP dfinit la fonction set_exception_handler permettant de dfinir une fonction de callback appele chaque exception souleve et non capture

Exemple d'utilisation de la fonction set_exception_handler
Sélectionnez

function exception_handler($myException)
{
    echo 'Exception non capture : '.$myException->getMessage();
}
 
set_exception_handler('exception_handler');
 
throw new Exception('voici une exception');
// Affichera l'exception non captur : voici une exception

IV-B. Bascule erreur->exception

Comme nous l'avons vu prcdemment, PHP5 n'utilise pas les exceptions, il se contente de les proposer au dveloppeur. Paralllement, PHP permet de redfinir le support des erreurs systme. Merveilleux, nous avons tout pour faire notre propre gestion des erreurs en utilisant les exceptions.

Exemple de redfintion de la gestion d'erreur
Sélectionnez

function exception_handler($code, $msg, $file, $line)
{
    throw new Exception($msg, $code);
}
 
set_error_handler('exception_handler');
 
try
{
    fopen();
}
catch (Exception $myException)
{
    echo '<div style="color:red">'.$myException->getMessage().'</div>';
}

Cet exemple est trop simple pour tre utilisable tel quel. Il retire beaucoup d'informations par rapport ce qu'apporterait une erreur. Pour l'tendre, nous pouvons d'une part crer une classe fille MyPHPException, charge de ne traiter que ce type d'erreur et nous laissant libre d'tendre nos exceptions ailleurs, d'autre part, nous pouvons ajouter les informations de l'erreur dans l'exception. Par exemple, nous pouvons obtenir la ligne et le fichier dans lequel s'est produite l'erreur, ainsi que le contexte ce stade du script. Nous pouvons ajouter aussi des informations apportes par l'exception. En effet, nous avons aussi accs au contexte lors de la leve d'exception. Ainsi, nous pouvons connatre la dernire fonction appele, dans laquelle s'est droule l'erreur. Nous avons aussi accs aux tableau super globaux et aux variables locales.

Voici notre nouveau script amlior :

Gestion complte des erreurs par les exceptions
Sélectionnez

/**
* @desc Notre classe d'exception pour les erreurs PHP
*/
class MyPHPException extends Exception
{
    /**
    * @desc Constructeur
    */
    public function __construct($msg, $code, $file, $line, $context)
    {
        $this->message = $msg;
        $this->code = $code;
        $this->line = $line;
        $this->file = $file;
        $this->context = $context;
 
        parent::__construct($msg, $code);
    }
 
    /**
    * @desc Affichage de l'erreur
    */
    public function showError()
    {
        echo 'PHP a gnr l\'erreur systme suivante : ['.$this->code.' | '.
            $this->getMessage().']  la ligne '.
            $this->line.' du fichier '.$this->file;
 
        // $Mytrace contient le contexte de l'exception
        // $this->context contient le contexte de l'erreur
 
        $Mytrace = $this->getTrace();
        //print_r($Mytrace);
        if ( ! empty($Mytrace['1']['function'] ))
        {
            echo ' sur la fonction '.$Mytrace['1']['function'];
        }     
        echo '<br /><br/>Contexte lors de l\'erreur :<br/><pre>';
        print_r($this->context);
        echo '</pre>';
    }
}
 
/**
* @desc la fonction de callback, charge de lancer l'exception
*/
function errorToException($code, $msg, $file, $line, $context)
{
    throw new MyPHPException($msg, $code, $file, $line, $context);
}
 
// redfinition de la gestion d'erreur
set_error_handler('errorToException');
 
// Enfin, notre script
try
{
    fopen();
}
catch (MyPHPException $myPHPException)
{
    echo '<div style="color:red">'.$myPHPException->showError().'</div>';
}

Ceci nous affichera l'cran :

 
Sélectionnez

PHP a gnr l'erreur systme suivante : [2 | fopen() expects at least 2 parameters, 0 given] 
 la ligne 44 du fichier .C:\wamp\www\exceptions\index.php sur la fonction fopen
 
Contexte lors de l'erreur :
 
Array
(
    [GLOBALS] => Array
 *RECURSION*
    [_ENV] => Array
        (
            [ALLUSERSPROFILE] => C:\Documents and Settings\All Users
            [CommonProgramFiles] => C:\Program Files\Fichiers communs
            [ComSpec] => C:\WINDOWS\system32\cmd.exe
            [FP_NO_HOST_CHECK] => NO
            [NUMBER_OF_PROCESSORS] => 1
            [OS] => Windows_NT
            ....
            ...

prcdentsommairesuivant

Copyright © 13/09/2006 Guillaume Affringue. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.