Les exceptions

Sommaire

PHP 5 a une gestion des exceptions similaire � ce qu'offrent les autres langages de programmation. Une exception peut �tre lanc�e ("throw") et attrap�e ("catch") dans PHP. Le code devra �tre entour� d'un bloc try pour faciliter la saisie d'une exception potentielle. Chaque try doit avoir au moins un bloc catch correspondant. Plusieurs blocs catch peuvent �tre utilis�s pour attraper diff�rentes classes d'exceptions. L'ex�cution normale (lorsque aucune exception n'est lanc�e dans le bloc try ou lorsqu'un catch correspondant � l'exception lanc�e n'est pas pr�sent) continue apr�s le dernier bloc catch d�fini dans la s�quence. Les exceptions peuvent �tre lanc�es (ou relanc�es) dans un bloc catch.

Lorsqu'une exception est jet�e, le code suivant le traitement ne sera pas ex�cut� et PHP tentera de trouver le premier bloc catch correspondant. Si une exception n'est pas attrap�, une erreur fatale issue de PHP sera envoy�e avec un message sp�cifiant que l'exception n'a pu �tre attrap�e � moins qu'un gestionnaire ne soit d�fini avec la fonction set_exception_handler().

Note: Les fonctions internes de PHP utilisent principalement l' Error reporting, seules les extensions orient�es objet utilisent les exceptions. Quoiqu'il en soit, des erreurs peuvent facilement �tre traduites en exceptions avec ErrorException.

Astuce

La biblioth�que standard PHP (SPL) fournit un bon nombre d'exceptions en dur.

Exemple #1 Lancer une exception

<?php
function inverse($x) {
    if (!
$x) {
        throw new 
Exception('Division par z�ro.');
    }
    else return 
1/$x;
}

try {
    echo 
inverse(5) . "\n";
    echo 
inverse(0) . "\n";
} catch (
Exception $e) {
    echo 
'Exception re�ue : ',  $e->getMessage(), "\n";
}

// Continue execution
echo 'Bonjour le monde !';
?>

L'exemple ci-dessus va afficher :

0.2
Exception re�ue : Division par z�ro.
Hello World

Exemple #2 H�ritage d'une exception

<?php

class MyException extends Exception { }

class 
Test {
    public function 
testing() {
        try {
            try {
                throw new 
MyException('foo!');
            } catch (
MyException $e) {
                
/* on 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!"