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.
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!"