Je voudrais un moyen plus propre pour obtenir les fonctionnalités suivantes, pour attraper AError
et BError
dans un bloc:
try
{
/* something */
}
catch( AError, BError $e )
{
handler1( $e )
}
catch( Exception $e )
{
handler2( $e )
}
Y a-t-il un moyen de faire ça? Ou dois-je les attraper séparément?
AError
et Berror
ont une classe de base partagée, mais ils la partagent également avec d'autres types que j'aimerais connaître handler2
, donc je ne peux pas simplement attraper la classe de base.
php
exception-handling
Dominic Gurto
la source
la source
Réponses:
Mettre à jour:
Depuis PHP 7.1, cela est disponible.
La syntaxe est:
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
etBError
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.Ensuite:
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 :Cela signifie que vous pourriez également avoir
que vous devez gérer différemment de
AError
ouBError
, de sorte que votre déclaration catch ressemblerait à ceci: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.
Puis:
L'utilisation de la POO en matière d'exceptions est très puissante. Utiliser des choses comme
get_class
ouinstanceof
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
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:
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.
la source
AError
pourrait être implémenté dans une bibliothèque / fichier mis à jour par un tiers.En PHP> = 7.1, c'est possible. Voir la réponse ci-dessous.
Si vous pouvez modifier les exceptions, utilisez cette réponse .
Si vous ne le pouvez pas, vous pouvez essayer de tout attraper avec
Exception
, puis vérifier avec quelle exception a été levéeinstanceof
.Mais il serait probablement préférable d' utiliser plusieurs blocs catch comme décrit dans la réponse susmentionnée .
la source
finally
déclaration. ;)... } else { throw($e); }
s'il ne correspond pas aux deux. Désolé pour la syntaxe peut-être erronée, n'a pas vu php depuis un moment.Venir en PHP 7.1 est la possibilité d'attraper plusieurs types.
Pour que ceci:
et
sont fonctionnellement équivalents.
la source
Depuis PHP 7.1,
intéressant, vous pouvez également:
et dans les versions antérieures de PHP:
la source
Cet article couvre la question electrictoolbox.com/php-catch-multiple-exception-types . Contenu du post copié directement de l'article:
Exemples d'exceptions
Voici quelques exemples d'exceptions qui ont été définis pour les besoins de cet exemple:
Gérer plusieurs exceptions
C'est très simple - il peut y avoir un bloc catch pour chaque type d'exception qui peut être levé:
Si une exception est levée qui n'est gérée par aucune des autres instructions catch, elle sera gérée par le bloc catch (Exception $ e). Ce n'est pas nécessairement le dernier.
la source
catch (Throwable $e)
intercepter toutes les exceptions. Voir aussi: php.net/manual/en/class.throwable.phpEn tant qu'extension de la réponse acceptée, vous pouvez changer le type d'exception, ce qui donne un modèle qui ressemble un peu à l'exemple d'origine:
la source
Voici une alternative raisonnable si vous ne contrôlez pas la définition des exceptions. Utilisez le nom de la variable d'exception pour classer les exceptions lorsqu'elles sont interceptées. Vérifiez ensuite la variable d'exception après le bloc try / catch.
Cette approche quelque peu étrange ne vaut probablement la peine que s'il y a beaucoup de duplication entre les implémentations de blocs catch.
la source
Outre la fonction Fall-Through, il est également possible de passer à l'étape suivante à l'aide de goto . C'est très utile si vous voulez voir le monde brûler.
3v4l.org
la source
Un excellent moyen est d'utiliser
set_exception_handler
.Avertissement!!! avec PHP 7, vous pourriez obtenir un écran blanc de la mort pour les erreurs fatales. Par exemple, si vous appelez une méthode sur un non-objet, vous obtiendrez normalement
Fatal error: Call to a member function your_method() on null
et vous vous attendez à voir cela si le rapport d'erreurs est activé.L'erreur ci-dessus ne sera PAS détectée
catch(Exception $e)
. L'erreur ci-dessus ne déclenchera PAS de gestionnaire d'erreur personnalisé défini parset_error_handler
.Vous devez utiliser
catch(Error $e){ }
pour intercepter les erreurs dans PHP7. . Cela pourrait aider:la source
catch (Throwable $e) { ... }
et en finir. Voir aussi: php.net/manual/en/class.throwable.phpUne autre option non répertoriée ici consiste à utiliser l'
code
attribut d'une exception, vous pouvez donc faire quelque chose comme ceci:la source
extends \Exception
?Hmm, il existe de nombreuses solutions écrites pour la version php inférieure à 7.1.
Voici un autre simple pour ceux qui ne veulent pas attraper tous les exceptions et ne peuvent pas créer d'interfaces communes:
la source