Étendre les Exceptions
PHP Manual
PHP Manual»Les exceptions»Étendre les Exceptions

Une classe d'exception définie par l'utilisateur peut être définie en étendant la classe Exception intégrée. Les membres et les propriétés ci-dessous montrent ce qui est accessible dans la classe enfant qui dérive de la classe Exception intégrée.

Exemple #1 La classe d'exception intégrée

<?php
class Exception implements Throwable
{
    protected $message = 'Unknown exception';   // Message d'exception
    private   $string;                          // cache de __toString
    protected $code = 0;                        // code d'exception défini par l'utilisateur
    protected $file;                            // nom de fichier source de l'exception
    protected $line;                            // ligne source de l'exception
    private   $trace;                           // trace de la pile d'exécution
    private   $previous;                        // exception précédente si exception imbriquée

    public function __construct($message = '', $code = 0, ?Throwable $previous = null);

    final private function __clone();           // Inhibe la duplication des exceptions.

    final public function getMessage();        // message de l'exception
    final public function getCode();           // code de l'exception
    final public function getFile();           // nom du fichier source
    final public function getLine();           // ligne source
    final public function getTrace();          // tableau de la trace de la pile d'exécution
    final public function getPrevious();       // l'exception précédente
    final public function getTraceAsString();  // trace sous forme de chaîne de caractères

    // Peut être redéfinie
    public function __toString();               // chaîne formatée pour l'affichage
}

Si une classe étend la classe Exception intégrée et redéfinit le constructeur, il est fortement recommandé qu'elle appelle également parent::__construct() pour s'assurer que toutes les données disponibles ont été correctement assignées. La méthode __toString() peut être redéfinie pour fournir une sortie personnalisée lorsque l'objet est présenté sous forme de chaîne de caractères.

Note:

Les exceptions ne peuvent pas être clonées. Tenter de cloner une Exception entraînera une erreur fatale E_ERROR.

Exemple #2 Étendre la classe Exception

<?php
/**
 * Définit une classe d'exception personnalisée.
 */
class MyException extends Exception
{
    // Redéfinit l'exception pour que le message ne soit pas facultatif.
    public function __construct($message, $code = 0, ?Throwable $previous = null) {
        // du code

        // s'assurer que tout est correctement assigné
        parent::__construct($message, $code, $previous);
    }

    // Représentation personnalisée de l'objet sous forme de chaîne de caractères.
    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éer 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:
                // Lance une exception personnalisée
                throw new MyException('1 n\'est pas un paramètre valide', 5);
                break;

            case self::THROW_DEFAULT:
                // Lance celle par défaut.
                throw new Exception('2 n\'est pas autorisé comme paramètre', 6);
                break;

            default:
                // Aucune exception, l'objet sera créé.
                $this->var = $avalue;
                break;
        }
    }
}


echo "# Exemple 1\n";
try {
    $o = new TestException(TestException::THROW_CUSTOM);
} catch (MyException $e) {      // Sera capturée
    echo "MyException capturée\n", $e;
    $e->customFunction();
} catch (Exception $e) {        // Ignoré
    echo "Exception par défaut capturée\n", $e;
}

// Poursuite de l'exécution
var_dump($o); // Null


echo "\n\n# Exemple 2\n";
try {
    $o = new TestException(TestException::THROW_DEFAULT);
} catch (MyException $e) {      // Ne correspond pas à ce type
    echo "MyException capturée\n", $e;
    $e->customFunction();
} catch (Exception $e) {        // Sera capturée
    echo "Exception par défaut capturée\n", $e;
}

// Poursuite de l'exécution
var_dump($o); // Null


echo "\n\n# Exemple 3\n";
try {
    $o = new TestException(TestException::THROW_CUSTOM);
} catch (Exception $e) {        // Sera capturée
    echo "Exception par défaut capturée\n", $e;
}

// Poursuite de l'exécution
var_dump($o); // Null


echo "\n\n# Exemple 4\n";
try {
    $o = new TestException();
} catch (Exception $e) {        // Sauté, aucune exception
    echo "Exception par défaut capturée\n", $e;
}

// Poursuite de l'exécution
var_dump($o); // TestException
To Top