Mise à jour :
A partir de PHP 7.1, ceci est disponible.
La syntaxe est la suivante :
try
{
// Some code...
}
catch(AError | BError $e)
{
// Handle exceptions
}
catch(Exception $e)
{
// Handle the general case
}
Docs : https://www.php.net/manual/en/language.exceptions.php#example-294
RFC : https://wiki.php.net/rfc/multiple-catch
Engagez-vous : https://github.com/php/php-src/commit/0aed2cc2a440e7be17552cc669d71fdd24d1204a
Pour PHP avant 7.1 :
Malgré ce que disent ces autres réponses, vous pouvez attraper AError
y BError
dans le même bloc (c'est un peu plus facile si c'est vous qui définissez les exceptions). Même s'il y a des exceptions que vous voulez "passer à travers", vous devriez être en mesure de définir une hiérarchie correspondant à vos besoins.
abstract class MyExceptions extends Exception {}
abstract class LetterError extends MyExceptions {}
class AError extends LetterError {}
class BError extends LetterError {}
Ensuite :
catch(LetterError $e){
//voodoo
}
Comme vous pouvez le constater aquí y aquí même le SPL
Les exceptions par défaut ont une hiérarchie dont vous pouvez tirer parti. De plus, comme indiqué dans le Manuel PHP :
Lorsqu'une exception est levée, le code suivant la déclaration ne sera pas exécuté, et PHP va essayer de trouver le premier bloc de capture correspondant.
Cela signifie que vous pourriez aussi avoir
class CError extends LetterError {}
que vous devez traiter différemment de AError
o BError
donc votre déclaration d'intention ressemblerait à ceci :
catch(CError $e){
//voodoo
}
catch(LetterError $e){
//voodoo
}
Si vous avez le cas où il y a vingt exceptions ou plus qui appartiennent légitimement à la même superclasse, et que vous avez besoin de traiter cinq (ou n'importe quel groupe plus ou moins important) d'entre elles d'une façon et le reste de l'autre, vous pouvez TOUJOURS le faire.
interface Group1 {}
class AError extends LetterError implements Group1 {}
class BError extends LetterError implements Group1 {}
Et puis :
catch (Group1 $e) {}
L'utilisation de la POO en matière d'exceptions est très puissante. L'utilisation de choses comme get_class
o instanceof
sont des hacks, et doivent être évités si possible.
Une autre solution que j'aimerais ajouter est de placer la fonctionnalité de traitement des exceptions dans sa propre méthode.
Vous auriez pu
function handleExceptionMethod1(Exception $e)
{
//voodoo
}
function handleExceptionMethod2(Exception $e)
{
//voodoo
}
En supposant qu'il n'y a absolument aucun moyen de contrôler les hiérarchies de classes d'exception ou les interfaces (et il y a presque toujours des sera être un moyen), vous pouvez faire ce qui suit :
try
{
stuff()
}
catch(ExceptionA $e)
{
$this->handleExceptionMethod1($e);
}
catch(ExceptionB $e)
{
$this->handleExceptionMethod1($e);
}
catch(ExceptionC $e)
{
$this->handleExceptionMethod1($e);
}
catch(Exception $e)
{
$this->handleExceptionMethod2($e);
}
De cette façon, vous n'avez toujours qu'un seul emplacement de code à modifier si votre mécanisme de gestion des exceptions doit changer, et vous travaillez dans le cadre des constructions générales de la POO.
7 votes
Juste pour ajouter ceci en tant que note secondaire : Un RFC a été déposé pour attraper les exceptions multiples. Nous verrons si cette fonctionnalité sera intégrée au langage PHP... wiki.php.net/rfc/multiple-catch
14 votes
Cette fonctionnalité a été implémentée dans PHP 7.1.
0 votes
En PHP 8.0, il existe un moyen encore plus propre : stackoverflow.com/a/64159544/7082164