(PHP 5, PHP 7, PHP 8)
Un bloc try délimite un segment de code susceptible de lancer avec throw
une erreur Throwable qui doit ĂȘtre traitĂ©e.
Un bloc try doit avoir au moins un bloc catch ou
finally correspondant.
Lorsqu'une erreur Throwable est lancée dans un
bloc try, PHP tente de trouver le premier bloc catch correspondant pour
traiter l'erreur. S'il n'en trouve aucun, la pile d'appels est dépilée
jusqu'à ce qu'un bloc catch correspondant soit trouvé ou que la portée
globale soit atteinte.
Un objet non attrapé est alors transmis au gestionnaire d'exceptions défini
avec set_exception_handler(), s'il y en a un ; sinon,
le script se termine avec une erreur fatale.
(PHP 5, PHP 7, PHP 8)
Un bloc catch définit comment réagir à une erreur
Throwable lancée.
Il spécifie une ou plusieurs sous-classes de
Throwable (le plus souvent
Exception) qu'il peut traiter, et
éventuellement une variable à laquelle l'exception est assignée.
Le premier bloc catch qui correspond Ă la classe de l'objet
Throwable lancé traite l'erreur.
L'exécution normale reprend aprÚs le bloc catch, sans entrer dans les
autres blocs catch correspondants.
Note:
Il n'est pas recommandé d'attraper les objets Error, car ils signalent une erreur de programmation.
Exemple #1 Attraper une exception
<?php
try {
throw new Exception('Erreur');
} catch (Exception $e) {
echo 'Exception attrapée : ', $e->getMessage(), "\n";
}
// Poursuite de l'exécution
echo "Bonjour le monde\n";L'exemple ci-dessus va afficher :
Exception attrapée : Erreur Bonjour le monde
à partir de PHP 7.1.0, un bloc catch peut spécifier une union de
sous-classes de Throwable qu'il doit traiter,
en utilisant le caractĂšre pipe (|). Ceci est utile
lorsque différentes exceptions, issues de hiérarchies de classes
diffĂ©rentes, sont traitĂ©es de la mĂȘme maniĂšre.
Exemple #2 Attraper une union de classes Ă traiter
<?php
class MyException extends Exception { }
class MyOtherException extends Exception { }
class Test {
public function testing() {
try {
throw new MyException();
} catch (MyException | MyOtherException $e) {
var_dump(get_class($e));
}
}
}
$foo = new Test;
$foo->testing();L'exemple ci-dessus va afficher :
string(11) "MyException"
Plusieurs blocs catch peuvent ĂȘtre utilisĂ©s pour traiter diffĂ©remment
différentes classes d'erreurs Throwable.
Exemple #3 Blocs catch multiples
<?php
try {
do_something_io_related();
} catch (FileNotFoundException $e) {
// Attrape uniquement FileNotFoundException et agit dans ce cas
} catch (MissingPermissionException $e) {
// Attrape uniquement MissingPermissionException et agit différemment dans ce cas
}
Des erreurs Throwable peuvent ĂȘtre lancĂ©es
(ou relancées) avec throw dans un bloc catch.
Exemple #4 Exception imbriquée
<?php
class MyException extends Exception { }
class Test {
public function testing() {
try {
try {
throw new MyException('foo!');
} catch (MyException $e) {
// la relance
throw $e;
}
} catch (Exception $e) {
var_dump($e->getMessage());
}
}
}
$foo = new Test;
$foo->testing();L'exemple ci-dessus va afficher :
string(4) "foo!"
Un objet lancé à l'intérieur d'un bloc catch ne sera pas
attrapé par un bloc catch adjacent.
Exemple #5 Blocs catch séquentiels
<?php
class A extends Exception {}
class B extends Exception {}
try {
throw new A;
} catch (A $e) {
throw new B;
} catch (B) {
echo 'Bonjour';
}Résultat de l'exemple ci-dessus est similaire à :
Fatal error: Uncaught B in /in/K8Tl9:9
Stack trace:
#0 {main}
thrown in /in/K8Tl9 on line 9
Ă partir de PHP 8.0.0, le nom de la variable d'une erreur
Throwable attrapée est optionnel.
S'il n'est pas spĂ©cifiĂ©, le bloc catch s'exĂ©cute quand mĂȘme, mais n'a pas
accÚs à l'objet lancé.
Exemple #6 Omettre la variable de l'exception attrapée
Autorisé uniquement à partir de PHP 8.0.0.
<?php
class SpecificException extends Exception {}
function test() {
throw new SpecificException('Oups');
}
try {
test();
} catch (SpecificException) {
print "Une SpecificException a été lancée, mais les détails importent peu.";
}L'exemple ci-dessus va afficher :
Une SpecificException a été lancée, mais les détails importent peu.
Voir la section sur la gestion des erreurs pour la hiérarchie de Throwable et la maniÚre de définir des exceptions personnalisées.