j'ai un souci de compréhension sur le code du paragraphe "Personnaliser les exceptions non attrapées" du tuto programmer en orienté objet en PHP dont voici le code :
class MonException extends ErrorException
{
public function __toString()
{
switch($this -> severity)
{
case E_USER_ERROR : //si l'utilisateur émet une erreur fatales
$type = 'Erreur fatale';
break;
case E_WARNING : //si php émet une alertes
case E_USER_WARNING : //si l'utilisateur émet une alertes
$type = 'Attention';
break;
case E_NOTICE : //si php émet une notice
case E_USER_NOTICE : //si l'utilisateur émet une notice
$type = 'Note';
break;
default : //Erreur inconnue
$type = 'Erreur inconnue';
break;
}
return '<strong>' . $type . '</strong> : [' . $this -> code . '] ' . $this -> message . '<br / ><strong>'
. $this -> file . '</strong> à la ligne <strong>' . $this -> line . '</strong>';
}
}
function error2exception($code, $message, $fichier, $ligne)
{
//Le code fait office de sévérité.
throw new MonException($message, 0, $code, $fichier, $ligne);
}
function customException($e)
{
echo 'Ligne ' . $e ->getLine() . ' dans ' . $e -> getFile(). '<br /><strong> Exception lancée </strong> : '
. $e -> getMessage();
}
set_error_handler('error2exception');
set_exception_handler('customException');
$a = 1/0; //on déclenche une erreur
A quel moment intervient set_error_handler('error2exception') dans le code car quand je déclenche une erreur volontaire (1/0) j'ai bien L’écho renvoyé par customException c'est à dire :
Ligne 56 dans C:\wamp\www\exceptions\gestionErreurs.php Exception lancée : Division by zero
je me demande à quoi sert donc set_error_handler('error2exception') ici . sauf quand je retire set_exception_handler('customException') du code, j'ai une alerte PHP orange avec ce qui semble bien être le retour de MonException() indiquée comme ceci :
Fatal error: Uncaught <strong>Attention</strong> : [0] Division by zero<br / ><strong>C:\wamp\www\exceptions\gestionErreurs.php</strong> Ã la ligne <strong>56</strong> thrown in C:\wamp\www\exceptions\gestionErreurs.php on line 56
est ce normal ? ou est ce que le type d'erreur n'est pas bon comme exemple ?
le setblablabla il faut le faire dès l'index, à la conf de ton site. J'ai une fonction autoload dans un script fonction.inc.php, j'inclue le script et derrière je fais le setblablabla
Donc il faut faire pareil, tu cales un autoload, puis tu fais le set de ta classe, l'autoload se chargera d'aller chercher le script là où tu l'a mis
Tu es sur une version < 7 ? Parce que normalement PHP lève à présent une exception et non plus une erreur sur une division par 0.
> est-ce normal ?
Tu t'attends à quoi au juste ? Avec PHP < 7, sur une division par zéro, ça émet une erreur (passage par la callback de set_error_handler) que tu transformes en exception (via le throw dans la callback de set_error_handler) pour nous conduire à la callback de set_exception_handler (et mettre fin au script).
En commentant ton instruction set_exception_handler, l'exception MonException levée par la callback de set_error_handler n'est plus interceptée par ton propre code donc c'est PHP (ou plutôt xdebug vu la mention d'un fond orange) qui l'intercepte, affiche et met fin au script. D'où d'ailleurs le "fatal error" et "uncaught" (pour le restant du message c'est la méthode __toString qui intervient d'où la différence avec les messages d'erreur traditionnels).
Pas vraiment, c'est en partie (juste sur l'exception qui ne s'en retrouve plus gérée donc transformée en erreur fatale par PHP) ce qui se passe et encore de manière indirecte mais l'enjeu de tout ça était vous montrer comment intercepter erreur/exception et éventuellement de montrer la différence de comportement de PHP qui en résulte.
L'aspect du message d'erreur n'est qu'un détail sans importance (de toute façon, en production, tu n'es pas censé les afficher ...).
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli