Exceptions �tendues
Une classe Exception d�finie par l'utilisateur peut �tre d�finie en �tendant la classe Exception interne. Les membres et les propri�t�s suivantes montrent ce qui est accessible dans la classe enfant qui est d�riv�e de la classe exception interne.
Exemple #1 La classe Exception interne
<?php
class Exception
{
protected $message = 'exception inconnu'; // message de l'exception
protected $code = 0; // code de l'exception d�fini par l'utilisateur
protected $file; // nom du fichier source de l'exception
protected $line; // ligne de la source de l'exception
function __construct(string $message=NULL, int code=0);
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
/* Remplacable */
function __toString(); // cha�ne format�e pour l'affichage
}
?>
Si une classe �tend la classe Exception interne et red�finit le constructeur, il est vivement recommand� qu'elle appelle aussi parent::__construct() pour s'assurer que toutes les donn�es disponibles ont �t� proprement assign�es. La m�thode __toString() peut �tre r��crite pour fournir un affichage personnalis� lorsque l'objet est pr�sent� comme une cha�ne.
Exemple #2 �tendre la classe Exception
<?php
/**
* D�finition d'une classe d'exception personnalis�e
*/
class MyException extends Exception
{
// Red�finissez l'exception ainsi le message n'est pas facultatif
public function __construct($message, $code = 0) {
// traitement personnalis� que vous voulez r�aliser ...
// assurez-vous que tout a �t� assign� proprement
parent::__construct($message, $code);
}
// cha�ne personnalis� repr�sentant l'objet
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}
public function customFunction() {
echo "Une fonction personnalis�e pour ce type d'exception\n";
}
}
/**
* Cr�ation d'une classe pour tester l'exception
*/
class TestException
{
public $var;
const THROW_NONE = 0;
const THROW_CUSTOM = 1;
const THROW_DEFAULT = 2;
function __construct($avalue = self::THROW_NONE) {
switch ($avalue) {
case self::THROW_CUSTOM:
// jette une exception personnalis�
throw new MyException('1 est un param�tre invalide', 5);
break;
case self::THROW_DEFAULT:
// jette l'exception par d�faut.
throw new Exception('2 n\'est pas autoris� en tant que param�tre', 6);
break;
default:
// Aucune exception, l'objet sera cr��.
$this->var = $avalue;
break;
}
}
}
// Exemple 1
try {
$o = new TestException(TestException::THROW_CUSTOM);
} catch (MyException $e) { // Devrait �tre attrap�e
echo "Capture mon exception\n", $e;
$e->customFunction();
} catch (Exception $e) { // Saut�
echo "Capture l'exception par d�faut\n", $e;
}
// Continue l'ex�cution
var_dump($o);
echo "\n\n";
//Exemple 2
try {
$o = new TestException(TestException::THROW_DEFAULT);
} catch (MyException $e) { // Ne correspond pas � ce type
echo "Capture mon exception\n", $e;
$e->customFunction();
} catch (Exception $e) { // Devrait �tre attrap�e
echo "Capture l'exception par d�faut\n", $e;
}
// Continue l'ex�cution
var_dump($o);
echo "\n\n";
// Exemple 3
try {
$o = new TestException(TestException::THROW_CUSTOM);
} catch (Exception $e) { // Devrait �tre attrap�e
echo "Capture l'exception par d�faut\n", $e;
}
// Continue l'ex�cution
var_dump($o);
echo "\n\n";
// Exemple 4
try {
$o = new TestException();
} catch (Exception $e) { // saut�, aucune exception
echo "Capture l'exception par d�faut\n", $e;
}
// Continue l'ex�cution
var_dump($o);
echo "\n\n";
?>