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).
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
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.
- 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 :
<?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 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.