IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] Gérer les exceptions et les erreurs


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    184
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 184
    Points : 56
    Points
    56
    Par défaut [POO] Gérer les exceptions et les erreurs
    Bonjour,

    Je suis entrain d'écrire un script PHP en PHP 5, j'utilise donc la POO ( trop bon )
    J'ai écrit une classe pour étendre la classe existante d'Exception ça marche bien quand je l'attrape avec un catch mais j'aimerais pousser le truc un peu plus loin :
    • J'aimerais que toutes les erreurs de script ( notice, warning, erreur de synthaxe ) utilise ma classe d'exception
    • J'aimerais que toutes les exceptions que j'oublie dans le script utilise aussi ma classe d'exception


    J'ai donc écrit ceci dans le fichier commun à toute mon application :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    /**
     * Dérivation des messages d'erreurs 
     */
    set_exception_handler('exception_handler');
    set_error_handler('exception_handler');
     
    function exception_handler($code,$msg)
    {
    	throw new MyEx($msg,$code);
    }
    Mais j'ai l'erreur :

    Fatal error: Exception thrown without a stack frame in Unknown on line 0
    Donc j'ai plusieurs questions :

    • Est-ce bien d'écrire tout mon bloc de code dans une condition try pour pouvoir attraper avec des catch mes exceptions ?
    • Les exceptions crée par mon gestionnaire d'exception sont catché ou ?
    • Comment remédier à l'erreur que j'ai cité ?


    Pour faire simple je veux avoir un contrôle sur tout ce qui sort de mon script sans que je le veuille pour pouvoir traiter ou enregistrer.
    Donc que le visiteur ne voit aucun message d'erreur mais que je puisse en faire ce que je veux


    Merci d'avance pour votre aide

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Citation Envoyé par iowa
    J'aimerais que toutes les erreurs de script ( notice, warning, erreur de synthaxe ) utilise ma classe d'exception
    Il n'est pas possible de toutes les intercepter : notamment celles qui sont fatales (surtout pour le parser comme les erreurs de syntaxe).

    Citation Envoyé par iowa
    Est-ce bien d'écrire tout mon bloc de code dans une condition try pour pouvoir attraper avec des catch mes exceptions ?
    C'est un peu le but, non ? Par ailleurs, cela vous permet d'agir différemment en fonction de l'exception levée. Je vous accorde que ça dépend de ses développements puisque les fonctions natives génèrent à 99% des erreurs.

    Citation Envoyé par iowa
    Les exceptions crée par mon gestionnaire d'exception sont catché ou ?
    Comment remédier à l'erreur que j'ai cité ?
    Exceptions et PHP5 : Boucle infinie

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 11
    Points : 13
    Points
    13
    Par défaut
    oui c'est comme si tu essayer de récupérer avec ton script un "parse error"

  4. #4
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    184
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 184
    Points : 56
    Points
    56
    Par défaut
    Merci à vous, alors je reformule :

    Comment avoir la main sur le maximum d'exception ?

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Si vous souhaitez ne montrer aucune erreur il y a des directives prévues pour cela (display_errors) et peuvent être indépendamment logguées dans le journal du serveur (log_errors). La fonction désignée par set_exception_handler est fatale mettant fin au script et ne vous permet pas, pour la raison indiquée plus haut, de lever une nouvelle exception. En revanche, set_error_handler peut tout à fait en lever une.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?php
    set_exception_handler('my_exception_handler');
    set_error_handler('my_error_handler');
     
    class MyException extends Exception
    {
    }
     
    function my_exception_handler($e)
    {
        printf('Exception : %s <br/>', $e->getMessage());
    }
     
    function my_error_handler($errno, $errstr, $errfile, $errline, $errcontext)
    {
        printf('Erreur %d : %s <br/>', $errno, $errstr);
        throw new MyException($errstr, $errno);
    }
     
    $fp = fopen('non_existant_file', 'r');
    Je ne vois pas comment faire mieux.

  6. #6
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    184
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 184
    Points : 56
    Points
    56
    Par défaut
    Oui mais l'objet $e de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my_exception_handler
    sera un objet MyException ?
    Qu'est-ce-qui passera par la fonction my_exception_handler ?
    toutes les exceptions ou que celles qui ne sont pas catché ?

    Merci pour vos réponses si intéressantes.

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Citation Envoyé par iowa
    sera un objet MyException ?
    Qu'est-ce-qui passera par la fonction my_exception_handler ?
    toutes les exceptions ou que celles qui ne sont pas catché ?
    Non : toute exception qui n'a pas été intercepté (catch) - c'est clairement écrit dans la documentation.

  8. #8
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    184
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 184
    Points : 56
    Points
    56
    Par défaut
    Désolé je ne comprends toujours pas.

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Citation Envoyé par iowa
    Oui mais l'objet $e sera un objet MyException ?
    Non pas spécialement : elle sera du type lancé et pas un autre. Si c'est throw new Exception(...), $e sera une simple Exception.

    Citation Envoyé par iowa
    Qu'est-ce-qui passera par la fonction my_exception_handler ?
    Uniquement la première qui n'est pas interceptée/gérée par un bloc catch.

    Citation Envoyé par iowa
    toutes les exceptions ou que celles qui ne sont pas catché ?
    Celles qui ne sont pas catchées comme dit ci-dessus.

    D'où l'intérêt plus que limité de ce que vous voul(i)ez faire

  10. #10
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    184
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 184
    Points : 56
    Points
    56
    Par défaut
    Merci j'ai tout compris, je vais maintenant tester et vous tenir au courant.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Java et les exceptions (message d'erreur)
    Par Khalfe dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 29/09/2013, 18h35
  2. Les fichiers et les exceptions
    Par yous18 dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 29/03/2011, 09h44
  3. [try/except] Ignorer les exceptions
    Par anthyme dans le forum Général Python
    Réponses: 3
    Dernier message: 19/01/2007, 19h56
  4. gérer les exceptions sur les constructeurs?
    Par LESOLEIL dans le forum Général Java
    Réponses: 9
    Dernier message: 15/03/2006, 10h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo