try...catch

try

(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.

catch

(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!"
Attention

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.

add a note

User Contributed Notes

There are no user contributed notes for this page.