Je fais un jeu de cartes simple dans PHP. Lorsqu'un utilisateur essaie de jouer une carte, je veux lancer une exception si elles peuvent / ne pouvez pas. Plutôt que de renvoyer un numéro avec une signification spécifique (par exemple 1 signifie une mauvaise carte, 2 signifie pas votre tour ... etc.), Je voulais utiliser des exceptions personnalisées. J'attraperais ces exceptions et afficherais le message à l'utilisateur.
Je me rends compte que des exceptions sont destinées à sortir des erreurs ordinaires, mais je pense que c'est un bon moyen de concevoir mon programme. P>
Le problème: Mes exceptions sont décourgues. J'ai une page appelée play.php qui contrôle une classe appelée jeu, qui a un tour qui jette l'exception. La page Play.PHP obtient le tour du jeu et appelle la fonction à ce sujet. Cependant, il est dit que l'exception n'est pas capturée au tour. P>
Y a-t-il une solution rapide pour cela? Comment puis-je bouillir l'exception de ma classe ronde à ma page play.php? P> J'ai essayé, pas attraper, jetant, etc. p> p>
3 Réponses :
Je suis d'accord avec certains des commentaires qu'il s'agit d'un moyen étrange de réaliser ce que vous voulez faire, mais je ne peux pas voir des problèmes de code réels. Mon étui de test:
class TestException extends Exception { } class TestClass { function raiseTestException() { try { throw new TestException("Test Exception raised"); } catch(TestException $e) { throw $e; } return; } } class CallerClass { function callTestCallMethod() { $test = new TestClass(); try { $test->raiseTestException(); } catch(TestException $e) { echo "Error: " . $e->getMessage(); } } } $caller = new CallerClass(); $caller->callTestCallMethod(); // result: "Error: Test Exception raised";
J'ai eu ce même comportement étrange avec des exceptions qui ne bouillonnent pas.
Il s'avère que j'avais les exceptions dans un autre espace de noms, mais je n'en faisais pas explicitement l'utiliser et PHP ne vous plaignez pas de cela.
Ajoutez donc hth. p> à l'aide de MyNamespace \ Exceptions \ MyException; Code> résolvez-le.
Peut-être que cela pourrait vous arriver aussi. P>
De plus, si vous utilisez des espaces de noms dans la classe où vous essayez d'attraper des choses, assurez-vous de faire: ...} Catch (\ EXCEPTION $ E) {... (Notez la barre oblique inverse, indiquant qu'il s'agit du "espace de noms racine" )
i juste ce même problème à Laravel 4.2
Comme Laravel écoute du gestionnaire \ exceptions, vous ne pouvez pas utiliser la racine pour lancer une exception et vous attendre à la bulle, sauf si vous ne modifiez ou n'étendez pas Laravel. Ce dont vous avez besoin est de créer une exception vide qui s'étend \ Exception pour votre espace de noms, puis attrapez votre exception au nom de noms, quelle que soit votre réponse. P>
<?php namespace Yournamespacehere; class Exception extends \Exception { }
Cela semble brisé.
Je viens d'un fond de java :)
Assez difficile de diagnostiquer sans code à regarder.
Utilisez-vous
essayer ... Catch code> blocs?
Je me rends compte que des exceptions sont destinées à partir des erreurs ordinaires, mais je pense que c'est un bon moyen de concevoir mon programme. Code> Je pense que je ne suis pas d'accord avec vous;). Qu'est-ce qui ne va pas avec les valeurs de retour des ols simples?
Rien n'est faux avec les valeurs de retour, je préfère simplement l'approche Java d'utiliser des exceptions, mais il semble que PHP n'est pas conçu pour cela. Alors retournez les valeurs c'est. Merci pour l'aide de tout le monde, je laisserai la question ouverte au cas où n'importe qui ait quelque chose à ajouter.
@Zdnil: err ... non. Bon code Java n'utilise pas d'exceptions pour des choses comme celle-ci non plus. Les exceptions sont destinées aux erreurs qui ne doivent pas être traitées par votre appelant immédiat. (C'est-à-dire une défaillance de la base de données), pas pour les chèques de routine (le joueur ne peut pas y déplacer). Exception i> S est pour Exception i> Al.
@Billy: Oui, je peux voir ça. Personne ne m'a jamais vraiment dit différent auparavant. J'utilise aussi des exceptions pour la saisie de l'utilisateur, c'est que ça va? Par exemple, un nom d'utilisateur invalide.
@Zdnil, gardez à l'esprit qu'il existe des frais généraux significatifs avec
essayer code> /
attraper code> et des exceptions. Vous ne devriez vraiment pas les utiliser pour manipuler des erreurs ou d'autres exceptions sérieuses. Certes, ce que vous avez ci-dessus est une utilisation inappropriée. Bien que cela fonctionne, il est assez inefficace.
Êtes-vous sûr que ce n'est pas une exception autre que RoundAlreadyStartedException qui est lancée? Dans ce cas, cela expliquerait pourquoi vous ne pouvez pas l'attraper.