php: capture d'exception et de continuer l'exécution, est-il possible?
Est-il possible à l'exception de catch et de continuer l'exécution du script?
Vous devez vous connecter pour publier un commentaire.
Est-il possible à l'exception de catch et de continuer l'exécution du script?
Vous devez vous connecter pour publier un commentaire.
Sûr, il suffit d'attraper l'exception des cas où vous souhaitez poursuivre l'exécution...
Bien sûr, cela a le problème de l'silencieusement à l'abandon de ce qui pourrait être une source très importante d'erreur. SomeOperation() peut échouer causant d'autres subtile, difficile de comprendre les problèmes, mais vous ne le saurez jamais si vous silencieusement chute de l'exception.
pass
en Python?try... catch... finally
bloc peut être beaucoup plus complexe qu'il n'y paraît, même pour un simple but. Il peut avoir plusieurs captures pour des cas particuliers, il peut encapsuler d'autrestry... catch... finally
blocs en tant que de besoin, une exception peut être relancée et a changé à partir de l'intérieur de lacatch
oufinally
bloc et le comportement du bloc est très fiable sur ce qui est défini parerror_reporting()
et si un gestionnaire a été défini avecset_exception_handler()
. Je vous suggère une visite à l'exception de la documentation à l'adresse php.net/manual/en/language.exceptions.php pour en savoir plus.Oui, mais cela dépend de ce que vous voulez exécuter:
E. g.
c()
sera toujours exécuté. Mais sia()
déclenche une exception,b()
est pas exécuté.Seulement mettre les trucs dans le
try
bloc qui est dépendant les uns des autres. E. g.b
dépend d'un résultat dea
il ne fait pas de sens de mettreb
après latry-catch
bloc.$e
doit être\Exception $e
ou similaires ou une erreur d'analyse seront jetéscatch
. Sinon, le code est juste casse et il peut être difficile de discerner pourquoi.Sûr:
Vous pouvez aller lire de la documentation PHP sur Exceptions.
catch
bloc, il peut jamais résultat dans une exception non interceptée.Oui.
cependant noter que php a aussi des codes d'erreur séparé d'exceptions, un héritage de rémanence de avant de php a de la poo primitives. La plupart des bibliothèques les builtins soulèvent encore des codes d'erreur, pas d'exceptions. Pour ignorer une erreur de code d'appel de la fonction avec le préfixe @:
php > 7
utiliser la nouvelle interface Throwable
Vue sous un autre angle c'est au retour d'une Exception, de ne PAS jeter de l'un, de la transformation de code.
J'avais besoin de le faire avec un template cadre que je suis en train d'écrire. Si l'utilisateur tente d'accéder à une propriété qui n'existe pas sur les données, je retour l'erreur du plus profond à l'intérieur de la fonction de traitement, plutôt que de le jeter.
Ensuite, dans le code appelant, je peux décider de se débarrasser de cette erreur renvoyé, provoquant l'essayer() pour catch(), ou tout simplement continuer:
Le résultat de ceci est, je reçois toujours le contexte de l'erreur d'origine, même si elle a été lancée au sommet.
Une autre option pourrait être de retour personnalisé NullObject ou un UnknownProperty objet et comparez-les avec que, avant de décider de voyage, le catch(), mais comme vous pouvez le re-générer des erreurs de toute façon, et si vous êtes dans le contrôle de l'ensemble de la structure, je pense que c'est un joli tour de la question de ne pas être en mesure de continuer à essayer/captures.
Une vieille question, mais j'ai eu dans le passé lors de l'entrée à l'écart à partir de VBA scipts de php, où vous pourriez nous "GoTo" pour re-entrer dans une boucle "Sur l'Erreur" avec un "Cv" et plus loin, il est allé encore le traitement de la fonction.
En php, après un peu d'essais et d'erreurs, j'utilise désormais imbriqués try{} catch{} pour la critique et non critique des processus, ou même pour interdépendants classe appels afin que je puisse trace mon chemin de retour pour le début de l'erreur.
par exemple, si la fonction b est la personne à charge sur la fonction, mais la fonction c est agréable d'avoir, mais ne devrait pas arrêter le processus, et je veux toujours savoir les résultats de tous les 3, peu importe, voici ce que je fais:
Maintenant, je peux boucle dans ma matrice de résultats pour chaque clé et d'en évaluer les résultats.
Si il y a un échec pour un() ou b().
J'ai encore un point de référence sur la manière dont il a obtenu avant une panne s'est produite au sein de l' $resultArr et si le gestionnaire d'exception est correctement réglé, je sais pas si c'était un() ou b() a échoué.
Si c() échoue, la boucle continue. Si c() a échoué à plusieurs reprises, avec un peu de post supplémentaires boucle logique je peux même savoir si c() a travaillé ou a eu une erreur à chaque itération par interroger $resultArr[$key][2].