Une erreur Throwable est un événement
d'exécution qui interrompt le flux normal des instructions. Lorsqu'une erreur
Throwable est lancée par throw, elle dépile
la pile d'appels jusqu'à être attrapée par un bloc catch ou jusqu'à
atteindre la portée globale.
Tous les blocs finally rencontrés en chemin sont exécutés.
Une erreur Throwable non attrapée est transmise
au gestionnaire d'exceptions défini avec
set_exception_handler(), s'il y en a un ; sinon, le
programme se termine avec une erreur fatale.
Pour lancer une erreur Throwable depuis du
code PHP, utilisez le mot-clé throw.
La bibliothèque standard PHP (SPL) fournit diverses exceptions natives. Il est également possible de créer des exceptions personnalisées en étendant la classe Exception.
Il est possible de traiter une erreur Throwable
dans PHP en entourant le code susceptible de lancer une erreur d'un bloc
try.
Les objets Throwable ne peuvent pas être
clonés. Tenter de cloner un tel
objet lance une erreur Error avec le message
suivant :
Trying to clone an uncloneable object of class ClassName.
Cela se produit même si une sous-classe déclare sa propre méthode
__clone().
Voir Exception::__clone() et
Error::__clone().
Il est possible d'ajouter un gestionnaire pour toute erreur
Throwable non attrapée avec
set_exception_handler().
Ceci est similaire à l'encapsulation de l'ensemble du code dans un bloc
try-catch, à ceci près que l'exécution ne reprend pas ensuite : le
script se termine une fois que le gestionnaire a retourné.
Une exception définie par l'utilisateur peut être créée en étendant la classe native Exception.
Si une classe étend la classe native Exception
et redéfinit le constructeur,
il est fortement recommandé qu'elle appelle aussi
parent::__construct() afin de s'assurer que toutes les
données disponibles ont été correctement assignées.
La méthode __toString() peut être
surchargée pour fournir une sortie personnalisée lorsque l'objet est
utilisé comme une chaîne de caractères.
Exemple #1 Étendre la classe Exception
<?php
class CustomException extends Exception
{
// Redéfinit le constructeur pour que le message ne soit pas optionnel
public function __construct($message, $code = 0, ?Throwable $previous = null) {
// du code
// S'assure que tout est correctement assigné
parent::__construct($message, $code, $previous);
}
// Représentation personnalisée de l'objet sous forme de chaîne
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}
public function customFunction() {
echo "Une fonction personnalisée pour ce type d'exception\n";
}
}
try {
throw new CustomException("Quelque chose s'est produit", 5);
} catch (CustomException $e) {
echo "Exception personnalisée attrapée\n", $e;
$e->customFunction();
}L'exemple ci-dessus va afficher :
Exception personnalisée attrapée CustomException: [5]: Quelque chose s'est produit Une fonction personnalisée pour ce type d'exception
La classe Exception possède de nombreuses sous-classes, parmi lesquelles les exceptions SPL et celles définies par les extensions.