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=NULLint 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";
?>