web-dev-qa-db-fra.com

PHP Erreur fatale: exception non capturée 'Exception'

Je joue avec les exceptions en PHP. Par exemple, j'ai un script qui lit une requête $ _GET et charge un fichier; Si le fichier n'existe pas, une nouvelle exception doit être levée:

if ( file_exists( $_SERVER['DOCUMENT_ROOT'] .'/'.$_GET['image'] ) ) {
    // Something real amazing happens here.
}
else {
    throw new Exception("The requested file does not exists.");
}

Le problème est que, lorsque j'essaie de fournir un fichier non existant pour le test, j'ai reçu une erreur 500 au lieu du message d'exception. Le journal du serveur est le suivant:

[09-Jul-2013 18:26:16 UTC] PHP Fatal error:  Uncaught exception 'Exception' with message 'The requested file does not exists.' in C:\sites\wonderfulproject\script.php:40
Stack trace:
#0 {main}
  thrown in C:\sites\wonderfulproject\script.php on line 40

Je me demande si je manque quelque chose de vraiment évident ici.

J'ai vérifié cette question PHP erreur fatale: exception non capturée "Exception" avec message mais ce n'est pas tout à fait comme mon problème et je n'ai pas de réponse concise.

Aidez-moi, s'il vous plaît?

* MODIFIER *

Il semble que cela soit lié au mot clé throw. Si j'utilise par exemple echo, le message affiché à l'écran est le suivant:

exception 'Exception' avec le message 'Le fichier n'existe pas.' dans C:\sites\wonderfulproject\script.php: 183 Trace de pile: # 0 {main}

Pourquoi donc?

** EDIT 2 **

Grâce à @Orangepill, j'ai mieux compris comment gérer les exceptions. Et j'ai trouvé un superbe tut de nettuts qui m'a beaucoup aidé. Le lien: http://net.tutsplus.com/tutorials/php/the-ins-and-outs-of-php-exceptions/

10
darksoulsong

Ceci est le comportement attendu pour une exception non capturée avec display_errors off. 

Vos options ici sont d'activer display_errors via php ou dans le fichier ini ou d'intercepter et de générer l'exception. 

 ini_set("display_errors", 1);

ou 

 try{
     // code that may throw an exception
 } catch(Exception $e){
     echo $e->getMessage();
 }

Si vous lancez des exceptions, l’intention est qu’à un moment donné, quelque chose s’attrape et se règle. Sinon, c'est une erreur de serveur (500).

Une autre option pour vous serait d’utiliser set_exception_handler pour définir un gestionnaire d’erreur par défaut pour votre script. 

 function default_exception_handler(Exception $e){
          // show something to the user letting them know we fell down
          echo "<h2>Something Bad Happened</h2>";
          echo "<p>We fill find the person responsible and have them shot</p>";
          // do some logging for the exception and call the kill_programmer function.
 }
 set_exception_handler("default_exception_handler");
22
Orangepill

Ajoutez juste un peu d’informations supplémentaires ici au cas où quelqu'un aurait le même problème que moi.

J'utilise des espaces de noms dans mon code et j'avais une classe avec une fonction qui lève une exception.

Cependant, mon code try/catch dans un autre fichier de classe a été complètement ignoré et l'erreur normale PHP pour une exception non interceptée a été renvoyée.

J'ai oublié d'ajouter "use\Exception;" en haut, en ajoutant que cela a résolu l'erreur.

9
xorinzor

Pour 

throw new Exception('test exception');

J'en ai 500 (mais je n'ai rien vu dans le navigateur), jusqu'à ce que je mette 

php_flag display_errors on

dans mon fichier .htaccess (uniquement pour un sous-dossier) . Il existe également des paramètres plus détaillés, voir Activation de l'affichage des erreurs dans php via htaccess uniquement

0
Eugene Lycenok