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

Exceptions et PHP5

Exceptions et PHP5


pr�c�dentsommairesuivant

II. H�ritage de la classe d'Exception

La classe d'exception que nous avons utilis�e jusqu'ici est la classe native de PHP5. Nous allons maintenant d�finir nos propres classes d'exception adapt�es � nos besoins, h�ritant de cette classe m�re. Nous allons commencer par �tudier les propri�t�s de la classe native puis comment cr�er et/ou utiliser les classes filles.

II-A. M�thode et attributs de la classe Exception

II-A-1. Attributs

La classe Exception poss�de 4 attributs protected (ce qui nous permet d'y avoir acc�s depuis une classe fille).

Attributs de la classe Exception
Sélectionnez

protected $message = 'exception inconnu';	// message
protected $code = 0;						// code erreur d�fini par l'utilisateur
protected $file;							// nom du fichier source de l'exception 
protected $line;							// ligne de la source de l'exception 

II-A-2. M�thodes

La classe poss�de un seul constructeur :

Constructeur de la classe Exception
Sélectionnez

function __construct(string $message=NULL, int code=0);

Ce constructeur est le seul moyen d'affecter des valeurs aux attributs $message et $code. Ces deux attributs doivent donc naturellement �tre d�finis par l'utilisateur. Pour instancier la classe et ainsi d�finir les valeurs de $message et $code, on utilise l'instruction throw vue ci-dessus.

La classe d�finit ensuite plusieurs accesseurs � ces attributs.

M�thodes de la classe Exception
Sélectionnez

final function getMessage();              // message de l'exception 
final function getCode();                // code de l'exception 
final function getFile();                // nom du fichier source 
final function getLine();                // ligne du fichier source 
final function getTrace();                // un tableau de backtrace() 
final function getTraceAsString();        // cha�ne formatt�e de trace

Les 4 premi�res m�thodes renvoient les attributs respectifs. La m�thode getTrace renvoie un tableau de toutes les exceptions lanc�es. En effet, comme vous choisissez vous m�me le comportement d'un traitement d'exception, vous n'�tes pas oblig� d'interrompre le script comme le ferait une erreur PHP.

Le tableau renvoy� est de la forme
  • line - La ligne o� s'est d�roul�e l'erreur
  • file - Le fichier o� s'est d�roul�e l'erreur
  • function - La fonction concern�e
  • class - La classe concern�e
  • type - Type d'appel de la m�thode (statique ou dynamique)
  • args - Les arguments de la m�thode

Enfin, la deni�re m�thode renvoie, comme la pr�c�dente, l'ensemble des exceptions lanc�es, mais sous forme de string.

Il faut noter que ces fonctions sont finales, elles ne peuvent donc pas �tre surcharg�es dans une classe fille.

II-B. Exemple d'h�ritage

La classe Exception de PHP5 est utilisable dans sa forme native, mais le but des exceptions est d'effectuer un traitement adapt� en r�ponse � une alerte particuli�re. PHP5 permet donc d'�tendre cette classe par h�ritage.

Voyons un exemple :

Exemple de classe fille de la classe Exception
Sélectionnez

<?php 
class MyException extends Exception 
{ 
    public function __construct($msg=NULL, $code=0) 
    { 
        parent::__construct($msg, $code); 
    } 
     
    public function addLog() 
    { 
        // Ajoute un log dans la table 
        mysql_query("INSERT INTO log (text) VALUES ('".$this->getMessage()."')"); 
    } 
     
    public function showError() 
    { 
        return '<div style="color:red">'.$this->getMessage().'</div>'; 
    } 
} 
  
 
try 
{ 
    throw new MyException('ceci est faux'); 
} 
catch(MyException $myException) 
{ 
    $myException->addLog(); 
    $myException->showError(); 
} 
?>

Ici, on utilise la classe MyException, qui va ins�rer un log dans une table, puis afficher un message format�.

On voit donc qu'il est possible de cr�er une gestion compl�te en fonction du type d'exception soulev�e. Les classes d'Exception permettent de travailler sur un contexte plut�t que sur un script complet. Ainsi, dans un m�me script, on peut avoir une classe d'exception pour les erreurs li�es au SGBD, une classe pour les erreurs XML, une classe pour les erreurs syst�me, une classe pour les erreurs utilisateur.....

Cascade d'exceptions
Sélectionnez

try
{
    if ( $x )
    {
        throw new MyException('ceci est faux');
    }
    $xml = new DomDocument();
    $sql = new SQLiteDatabase( $filename );
}
catch(MyException $myException)
{
    $myException->addLog();
    $myException->showError();
}
catch(DOMException $myDOMException)
{
    echo 'Erreur XML';
}
catch(SQLiteException $mySQLIteException)
{
    echo 'erreur SQL';
}

Si x == false, nous lancerons l'exception MyException comme nous l'avons d�fini manuellement. Mais nous pouvons aussi attraper 2 exceptions que nous ne connaissons pas. Ces exceptions sont d�finies respectivement dans les extensions DOM et SQLITE. En effet, certaines extensions poss�dent leur propre classe d'Exception, facilitant le travail du d�veloppeur en lui �vitant de se demander comment acc�der aux donn�es � afficher en cas d'erreur. Ceci refl�te ce qui a �t� dit au I-B, c'est-�-dire que les fonctions et classes lancent elles-m�mes leurs exceptions, qui sont attrap�es par le d�veloppeur dans le code plut�t que dans les fonctions/classes elles-m�mes.


pr�c�dentsommairesuivant