115 votes

Le bloc try / catch en PHP n'a pas attrapé d'exception

J'essaie de lancer cet exemple n ° 1 à partir de cette page: http://php.net/manual/fr/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, je reçois:

 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éveloppeur que j’utilise est UniServer 3.5 avec PHP 5.2.3

245voto

Pius Points 2012

J'ai juste eu exactement ce problème là où il semblait que j'avais même copié le nom de l'exception et pourtant il n'a pas l'attraper. Il s'est avéré que c'était mon erreur stupide, mais j'ai pensé que je devrais poster mon cas ici dans le cas où il y a quelqu'un d'autre dans la même situation.

J'ai eu mon exception dans mon espace de noms appelé Un et le script est dans un espace de noms appelé B. Le problème était que j'avais Un\MyException qui est égal à (en PHP) \B\A\MyException (parce que mon script est dans l'espace de noms appelé B!). Tout ce que j'avais à faire c'était d'ajouter une barre oblique inverse (ou quelque chose comme ça) à l'exception du nom, de sorte qu'il pourrait ressembler à ceci: \A\MyException

23voto

Vous ne pouvez pas utiliser le typique try{} catch{} blocs en PHP comme vous pourriez le faire dans un autre langage comme le C# (Csharp).

Si vous faites cela:

try{
    //division by zero
    $number = 5/0;
}
catch(Exception $ex){
    echo 'Got it!';
}

Vous ne verrez pas le "Got it!" message de ne jamais. Pourquoi? C'est juste parce que PHP a toujours besoin d'une Exception à être "Jeté". Vous devez définir votre propre gestionnaire d'erreurs et de lever une Exception avec elle.

Voir set_error_handler fonction: http://co.php.net/manual/es/function.set-error-handler.php

6voto

erisco Points 6101

Vous n'exécutez pas le même code, sinon l'exception serait levée sur la ligne 4 au lieu de 7. Quel code exécutez-vous exactement?

6voto

sfrench Points 802

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 original et collez vos résultats. Cela vous aidera à mieux diagnostiquer votre problème.

 <?php

//set up exception handler to report what we didn't catch
function exception_handler($exception) {

    if($exception instanceof MyException) {
        echo "you didn't catch a myexception instance\n";

    } else if($exception instanceof Exception) {
        echo "you didn't catch a exception instance\n";

    } else {
        echo "uncaught exception of type: ".gettype($exception)."\n";
    }

    echo "Uncaught exception: " , $exception->getMessage(), "\n";
}

//install the handler
set_exception_handler('exception_handler');

class MyException extends Exception {
}

function inverse($x) {
    if (!$x) {
        throw new MyException('Division by zero.');
    }
    else return 1/$x;
}

try {
    echo inverse(5) . "\n";
    echo inverse(0) . "\n";
} catch (MyException $e) {
    echo 'Caught myexception: ',  $e->getMessage(), "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

// Continue execution
echo 'Hello World';
?>
 

4voto

Yawar Points 31

J'ai eu le même problème avec les configurations suivantes,

PHP 5.2.14 (cli) (de construction: Août 12 2010 17:32:30) Copyright (c) 1997-2010 Le PHP Group Zend Engine v2.2.0, le droit d'Auteur (c) 1998-2010 Zend Technologies avec eAccelerator v0.9.5.1, le droit d'Auteur (c) 2004-2006 eAccelerator, par eAccelerator

La solution est de désactiver eAccelerator ou le mettre à jour. J'ai essayé les deux et les deux correctifs travaillé. Le bug est signalé ici https://eaccelerator.net/ticket/242 (NB. firefox se plaint de leur SSL cert) .

Maintenant, je suis en cours d'exécution essayer de l'attraper correctement avec les configurations suivantes,

PHP 5.2.4 (cli) (intégrée: 16 Oct 2007 09:13:35) Copyright (c) 1997-2007 Le PHP Group Zend Engine v2.2.0, le droit d'Auteur (c) 1998-2007 Zend Technologies avec eAccelerator v0.9.6.1, le droit d'Auteur (c) 2004-2010 eAccelerator, par eAccelerator

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X