w00t, ça a l'air confus ^^
Dans
je n'attrape l'exception que si elle est de la classe "ClassName" (ou qu'elle en hérite).Dans
Code PHP :
<?php
catch (ClassName $e) { ... }
Donc si à aucun moment je n'intercepte la classe "Exception", il se peut que je laisse passer certaines exceptions. Dans ce cas, l'exécution du contexte en cours s'interrompt, et l'exception remonte au contexte appelant. Exemple :
Code PHP :
<?php
// Mes types d'exceptions
class NotAFileException extends Exception {}
class NotReadableException extends Exception {}
// Une fonction qui vérifie que le paramètre est un nom de fichier valide
// @throws NotAFileException
function isAFile($file) {
if (!is_file($file)) {
throw new NotAFileException('file not found : ' . $file);
}
}
// Une fonction qui renvoie le contenu d'un fichier, ou lève une exception
// @throws NotAFileException
// @throws NotReadableException
function readAFile($file) {
if (!is_readable($file)) {
throw new NotReadableException('cannot read : ' . $file);
}
isAFile($file); // Lève FileNotFoundException si ce n'est pas un fichier,
// on n'essaie pas de l'intercepter, on laisse le "contexte appelant" s'en charger
return file_get_contents($file);
}
// Une fonction qui récupère le contenu d'un fichier, chaine vide s'il ne s'agit pas d'un fichier valide
// @throws NotReadableException
function fileContent($file) {
try {
$content = readAFile($file); // Peut lever NotReadableException (problème de droit)
// ou NotAFileException (n'est pas un fichier)
} catch (NotAFileException $e) { // Il ne s'agit pas d'un fichier valide
return '';
} // On n'intercepte pas l'exception NotReadable
}
// Dans le code principal :
try {
$content = fileContent('monFichier'); // Seule l'exception "NotReadableException" peut être levée,
// puisque fileContent intercepte et traite "NotAFileException"
} catch (NotReadableException $e) {
echo 'problème de droit';
} catch (Exception $e) {
echo 'autre exception non traitée : ' . $e->getMessage();
}