Partage
  • Partager sur Facebook
  • Partager sur Twitter

exceptions

demandes d'infos sur set error handler

    12 mars 2017 à 15:43:52

    bonjour

    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 ?

    merci de votre aide

    • Partager sur Facebook
    • Partager sur Twitter
      22 mai 2018 à 13:22:25

      Salut,

      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 ;)

      • Partager sur Facebook
      • Partager sur Twitter
        22 mai 2018 à 14:32:50

        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).

        -
        Edité par julp 22 mai 2018 à 14:37:35

        • Partager sur Facebook
        • Partager sur Twitter
          22 mai 2018 à 17:17:21

          Ok donc set_error_handler permet de modifier l'erreur retournée par l'analyseur et set_exception_handleur permet de modifier sa mise en forme?
          • Partager sur Facebook
          • Partager sur Twitter
            22 mai 2018 à 18:08:58

            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 ...).

            -
            Edité par julp 22 mai 2018 à 18:11:33

            • Partager sur Facebook
            • Partager sur Twitter
              23 mai 2018 à 19:12:12

              OK, merci pour les explications!
              • Partager sur Facebook
              • Partager sur Twitter

              exceptions

              × 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.
              • Editeur
              • Markdown