II. Héritage de la classe 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 quatre attributs protected (ce qui nous permet d'y avoir accès depuis une classe fille)
II-A-2. Méthodes▲
La classe possède un seul constructeur :
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.
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 formatée de trace
Les quatre 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 derniè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 :
<?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…
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 deux 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.