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

  

Copyright © 13/09/2006 Guillaume Affringue. Aucune reproduction, même partielle, ne peut être faite de ce site et 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.