Reprendre PHP au script d'exécution après exception
J'ai un script php permet de dire que lors de l'exécution des scripts déclenche une exception. Je veux que mon PHP pour reprendre là où il l'avait laissé (où il avait jeté l'exception).
Dois-je mettre le même code d'exécution dans la "capture" de la partie du code?
Exemple, se permet de dire se connecte à mySQL, il échoue pour la connection timed out
function someCode(){
$pdostmt = $this->prepare($this->sql);
if($pdostmt->execute($this->bind) !== false) {
if(preg_match("/^(" . implode("|", array("select", "describe", "pragma")) . ") /i", $this->sql))
return $pdostmt->fetchAll($this->fetchOption);
elseif(preg_match("/^(" . implode("|", array("delete", "insert", "update")) . ") /i", $this->sql))
return $pdostmt->rowCount();
}
try {
someCode();
}
} catch (PDOException $e) {
//re-execute same code as within the try clause?
someCode();
}
source d'informationauteur MCHam
Vous devez vous connecter pour publier un commentaire.
Il est tout d'abord clair que une exception est mortelle si elle n'est pas pris. L'interception d'une exception ne pas arrêter l'exécution du script. Il se contente de cesse de le frame de pile dans le bloc try et les transferts de contrôle pour le bloc catch. À partir de là, votre script continuera à exécuter en tant que normale.
Par la capture de l'exception ici, nous avons toujours reprendre le cours normal de l'exécution de script après l'exception est interceptée...
Ce que vous voulez est un gestionnaire d'exception. Pour utiliser un gestionnaire d'exception, de sorte que vous n'avez pas à manipuler chaque exception dans
try
/catch
des blocs, vous pouvez effectuer les opérations suivantes...Edit: Après clarifier votre question, je pense que je dois préciser ce que vous voulez n'est pas un gestionnaire d'exception, mais vous avez réellement ne voulez pas utiliser des Exceptions à tout. Ce que vous essayez de le faire ne nécessite pas de lever des Exceptions à tout. Ne mettez pas de PDO en exception de mode si ce que vous voulez faire est de simplement gérer l'erreur comme ça. Une Exception ne devrait être utilisé pour gérer les exceptionnelle erreurs. Le point de l'ensemble d'une exception est à assurez-vous de tenir votre promesse. Par exemple, si votre fonction fait la promesse de toujours renvoyer un objet PDOStatement, et il est un cas où il ne peut pas le faire, alors il est logique de lancer une Exception. Cela permet à l'appelant que nous savons que nous avons atteint un point où nous ne peut pas tenir notre promesse.
Ce que vous voulez est à la base de la gestion d'erreur...
Utiliser php 4/5 register_shutdown_function.
Doc ici: http://php.net/manual/en/function.register-shutdown-function.php
Je vais supposer que vous êtes incapable de gérer l'exception de la fonction qu'il est en cours de levée. Si vous souhaitez le reprendre à l'endroit où l'exception a été levée vous avez besoin pour gérer l'exception. Tout le reste est mauvais codage résultant de la confusion pour vous ou toute autre personne travaillant sur le projet. Nous laissons exception aller jusqu'à l'arbre, parce que nous ne pouvons pas les traiter dans la fonction elle-même en raison de questions de portée.
Quant à votre exemple que je vais développer. Vous dites que l'opération ne peut pas continuer car la connexion ne peut pas se produire. En réalité, nous ne voulons pas de façon flagrante réessayer la fonction, car nous allons créer un point d'accroche de constamment tenter de la connexion afin que nous utilisons un bloc catch plus haut de l'arbre où l'on peut avertir l'utilisateur et demandez-leur de décider ce que nous voulons faire. En faisant cela, nous pouvons utiliser les blocs catch dans les bons endroits pour enregistrer les données afin de pouvoir restaurer les données et de les exécuter à un moment plus tard. En réalité, nous voulons le vent, jusqu'à un point avant le bloc try.
Cela vous donnera une bien meilleure chemin d'exécution. Parfois, vous avez à repenser une fonction/méthode afin qu'elle ne fait qu'une chose et une chose correctement.
De mettre la réponse à votre question simplement et sans ménagement. Non, c'est une mauvaise idée d'appeler l'essayer(ed) fonction dans le bloc catch et la simple raison est que vous avez pas de temps avez un bloc d'essayer d'attraper une exception. Exceptions apporter plus significative de la gestion d'erreur puis juste en passant le vrai et le faux comme un retour. Toutefois, cela ne signifie pas que vous devez aller autour de la boucle dans la manipulation.
Maintenant, pour un autre exemple... Disons que nous avons plusieurs serveurs, nous pouvons connecter et vous avez envie de courir à la pensée de la liste vous mettez le try/catch à l'intérieur d'une boucle et de la catch vérifier que l'exception et faire un nettoyage avant l'exécution de la boucle suivante. Si une exception se produit, nous (re)lancer l'exception. La bonne façon d'atteindre ce que vous cherchez serait comme ça.
Vous pourriez être en mesure d'utiliser la partie enfin de le try catch, si vous n'obtiendrez pas une exception à l'exécution.