J'essaye d'exécuter cet exemple # 1 à partir de cette page: http://php.net/manual/en/language.exceptions.php
<?php
function inverse($x) {
if (!$x) {
throw new Exception('Division by zero.');
}
return 1/$x;
}
try {
echo inverse(5) . "\n";
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
// Continue execution
echo "Hello World\n";
?>
Cependant, au lieu de la sortie souhaitée, j'obtiens:
0.2
Fatal error: Uncaught exception 'Exception' with message 'Division by zero.'
in xxx:
7 Stack trace: #0 xxx(14): inverse(0) #1 {main} thrown in xxx on line 7
L'environnement de développement que j'utilise est UniServer 3.5
avecPHP 5.2.3
Réponses:
J'ai juste eu ce problème exact où il semblait que j'avais même copié le nom de l'exception et pourtant il ne l'a pas attrapé. Il s'est avéré que c'était ma stupide erreur, mais j'ai pensé que je devrais publier mon cas ici au cas où quelqu'un d'autre serait dans la même situation.
J'ai eu mon exception dans mon espace de noms appelé A et le script était dans un espace de noms appelé B . Le problème était que j'avais A \ MyException qui équivaut (en PHP) \ B \ A \ MyException (car mon script est dans l'espace de noms appelé B !). Tout ce que j'avais à faire pour résoudre ce problème était d'ajouter une barre oblique inverse (ou son nom) au nom de l'exception afin que cela ressemble à ceci: \ A \ MyException
la source
catch (\Exception $e)
. Sans la barre oblique inverseException
est spécifique à l'espace de noms et ne sera pas mis en correspondance (ni intercepté).Question assez ancienne, pourtant ...
J'ai eu ce problème aussi (et c'est comme ça que j'ai trouvé ce post) mais une simple expérience m'a permis de trouver la solution. Essayez simplement de passer
Exception
à\Exception
. A travaillé pour moi!ÉDITER:
Comme sivann l'a souligné dans les commentaires, l'utilisation de l'espace de noms devrait faire la même chose. Alors mettez simplement
use \Exception as Exception;
avant votre déclaration de classe.la source
use Exception;
devrait le faireEssayez de mettre
catch(\Exception $e)
au lieu decatch(Exception $e)
. Si vous utilisez un code que vous ne connaissez pas très bien, ou - en particulier - si vous utilisez un framework, il peut remplacer l'exception PHP par défaut par l'une des siens, et par conséquent, vous risquez d'aller sur le mauvais chemin et d'obtenir le résultat indésirable. Si vous venez de mettre\Exception
, vous êtes sûr que vous attrapez l'exception PHP de base.la source
Vous ne pouvez pas utiliser les blocs try {} catch {} typiques en PHP comme vous pourriez le faire dans un autre langage comme C # (Csharp).
Si tu fais ça:
Vous ne verrez pas le "Got it!" message jamais. Pourquoi? C'est juste parce que PHP a toujours besoin d'une exception pour être «levée». Vous devez définir votre propre gestionnaire d'erreurs et lancer une exception avec lui.
Voir la fonction set_error_handler : http://php.net/manual/es/function.set-error-handler.php
la source
$number = 5/0;
ne lève pas d'exception.$number
est défini pour êtreINF
.Ma première remarque est que vous avez une faute de frappe dans le nom de l'exception que vous attrapez / lancez, mais si votre code est exactement le même, je ne sais pas exactement ce qui se passe.
Essayez la modification suivante du script d'origine et collez vos résultats. Cela vous aidera à diagnostiquer un peu mieux votre problème.
la source
J'ai eu le même problème avec les configurations suivantes,
PHP 5.2.14 (cli) (build: 12 août 2010 17:32:30) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies with eAccelerator v0.9.5. 1 , Copyright (c) 2004-2006 eAccelerator, par eAccelerator
La solution consiste à désactiver eAccelerator ou à le mettre à jour. J'ai essayé les deux et les deux correctifs ont fonctionné. Le bug est signalé ici https://eaccelerator.net/ticket/242 (NB. Firefox se plaint de son certificat SSL).
Maintenant, je cours, essayez d'attraper correctement avec les configurations suivantes,
PHP 5.2.4 (cli) (construit: 16 octobre 2007 09:13:35) Copyright (c) 1997-2007 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies with eAccelerator v0.9.6. 1 , Copyright (c) 2004-2010 eAccelerator, par eAccelerator
la source
\ L'exception ne fonctionne pas pour moi mais j'ai trouvé une solution.
J'avais besoin de remplacer try {} catch (Exception $ e) {} par try {} catch (Throwable $ e) {}.
Pour plus d'informations: https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/
la source
dans Xdebug il y a un paramètre:
Cela forcera php à afficher des exceptions même dans un bloc try catch. Transformez ceci en
0
la source
Si vous utilisez PHP 7, vous aurez peut-être besoin de Throwable au lieu d'Exception
la source
Essayez peut-être de désactiver certaines extensions tierces que vous avez peut-être installées? http://bugs.php.net/bug.php?id=41744
la source
TLDR; assurez-vous que vous avez
use Exception;
en haut des deux fichiers phpla source
Je vis cela aussi. J'ai lu le commentaire de Rowinson Gallego sur l'état d'exception qui doit être levé. J'ai donc modifié mon code à partir de:
dans:
Ça marche.
la source