Mettre à jour:
Depuis PHP 7.1, cela est disponible.
La syntaxe est:
try
{
// Some code...
}
catch(AError | BError $e)
{
// Handle exceptions
}
catch(Exception $e)
{
// Handle the general case
}
Documents: https://www.php.net/manual/en/language.exceptions.php#example-287
RFC: https://wiki.php.net/rfc/multiple-catch
Valider: 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
et BError
dans le même bloc (c'est un peu plus facile si vous êtes celui qui définit les exceptions). Même étant donné qu'il y a des exceptions que vous souhaitez «ignorer», vous devriez toujours ê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 voir ici et ici , même les SPL
exceptions par défaut ont une hiérarchie que vous pouvez exploiter. De plus, comme indiqué dans le manuel PHP :
Lorsqu'une exception est levée, le code suivant l'instruction ne sera pas exécuté et PHP tentera de trouver le premier bloc catch correspondant.
Cela signifie que vous pourriez également avoir
class CError extends LetterError {}
que vous devez gérer différemment de AError
ou BError
, de sorte que votre déclaration catch ressemblerait à ceci:
catch(CError $e){
//voodoo
}
catch(LetterError $e){
//voodoo
}
Si vous aviez le cas où il y avait au moins vingt exceptions qui appartenaient légitimement à la même superclasse et que vous deviez en gérer cinq (ou un groupe de grande taille) d'une manière et les autres de l'autre, vous pouvez TOUJOURS le faire.
interface Group1 {}
class AError extends LetterError implements Group1 {}
class BError extends LetterError implements Group1 {}
Puis:
catch (Group1 $e) {}
L'utilisation de la POO en matière d'exceptions est très puissante. Utiliser des choses comme get_class
ou instanceof
sont des hacks, et devrait être évité si possible.
Une autre solution que j'aimerais ajouter est de mettre la fonctionnalité de gestion des exceptions dans sa propre méthode.
Tu aurais 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 ou les interfaces des classes d'exception (et il y en aura presque toujours un), vous pouvez effectuer les opérations suivantes:
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 que vous devez modifier si votre mécanisme de gestion des exceptions doit changer, et vous travaillez dans les constructions générales de la POO.