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

Exceptions et PHP5

Exceptions et PHP5


prcdentsommairesuivant

II. Hritage de la classe d'Exception

La classe d'exception que nous avons utilise jusqu'ici est la classe native de PHP5. Nous allons maintenant dfinir nos propres classes d'exception adaptes nos besoins, hritant de cette classe mre. Nous allons commencer par tudier les proprits de la classe native puis comment crer et/ou utiliser les classes filles.

II-A. Mthode et attributs de la classe Exception

II-A-1. Attributs

La classe Exception possde 4 attributs protected (ce qui nous permet d'y avoir accs depuis une classe fille).

Attributs de la classe Exception
Sélectionnez

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

II-A-2. Mthodes

La classe possde 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 dfinis par l'utilisateur. Pour instancier la classe et ainsi dfinir les valeurs de $message et $code, on utilise l'instruction throw vue ci-dessus.

La classe dfinit ensuite plusieurs accesseurs ces attributs.

Mthodes 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();        // chane formatte de trace

Les 4 premires mthodes renvoient les attributs respectifs. La mthode getTrace renvoie un tableau de toutes les exceptions lances. En effet, comme vous choisissez vous mme 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 droule l'erreur
  • file - Le fichier o s'est droule l'erreur
  • function - La fonction concerne
  • class - La classe concerne
  • type - Type d'appel de la mthode (statique ou dynamique)
  • args - Les arguments de la mthode

Enfin, la denire mthode renvoie, comme la prcdente, l'ensemble des exceptions lances, mais sous forme de string.

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

II-B. Exemple d'hritage

La classe Exception de PHP5 est utilisable dans sa forme native, mais le but des exceptions est d'effectuer un traitement adapt en rponse une alerte particulire. PHP5 permet donc d'tendre cette classe par hritage.

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 insrer un log dans une table, puis afficher un message format.

On voit donc qu'il est possible de crer une gestion complte en fonction du type d'exception souleve. Les classes d'Exception permettent de travailler sur un contexte plutt que sur un script complet. Ainsi, dans un mme script, on peut avoir une classe d'exception pour les erreurs lies au SGBD, une classe pour les erreurs XML, une classe pour les erreurs systme, 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 dfini manuellement. Mais nous pouvons aussi attraper 2 exceptions que nous ne connaissons pas. Ces exceptions sont dfinies respectivement dans les extensions DOM et SQLITE. En effet, certaines extensions possdent leur propre classe d'Exception, facilitant le travail du dveloppeur en lui vitant de se demander comment accder aux donnes afficher en cas d'erreur. Ceci reflte ce qui a t dit au I-B, c'est--dire que les fonctions et classes lancent elles-mmes leurs exceptions, qui sont attrapes par le dveloppeur dans le code plutt que dans les fonctions/classes elles-mmes.


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.