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 :

Empêcher l'arrêt d'un script suite à une erreur


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut Empêcher l'arrêt d'un script suite à une erreur
    Bonjour,

    Lorsque l'on a une erreur fatale (du genre Fatal error: Call to undefined function), comme tout le monde le sait, un script PHP s'arrête.

    J'aimerai savoir s'il est possible d'empêcher l'arrêt de ce script ; une sorte de try qui marcherai avec autre chose que des exceptions.
    Tout le code susceptible de planter est placé dans un include.

    Merci d'avance,
    ProgVal

  2. #2
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 451
    Points : 4 600
    Points
    4 600
    Par défaut
    je n'ai jamais essaye, mais comme le @ empeche l'affichage des messages d'erreur, peut-etre cela empeche-t-il le script de s'arreter ?
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  3. #3
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    Non, ça ne marche pas.

    (par contre, l'erreur ne s'affiche pas)

  4. #4
    Membre chevronné Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Points : 1 895
    Points
    1 895
    Par défaut
    regarde là pour intercepter l'erreur :
    http://www.developpez.net/forums/d80...r/#post4666604
    GNAP !

  5. #5
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    Merci à toi.
    J'ai essayé d'implémenter le code que tu me donnes, mais un problèmes se pose :
    Je souhaite que les affichages se produisent en temps réel, et non retardés. Donc, ce que je peux faire, c'est quelque chose de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while (!$MUST_RELOAD_KERNEL)
    {
       function error_catcher()
       {
          ob_start('error_catcher');
          include('mon_code.php');
       }
    }
    Le problème est que cela obligerai la fonction à être redéfinie... Il y a donc deux solutions:
    1. trouver une autre méthode
    2. trouver comment redéfinir une fonction

    ProgVal

    PS : de plus, le fichier mon_code.php est susceptible d'être modifié pendant l'exécution

  6. #6
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Salut,

    Regardes avec "error_reporting(0);" et la fonction " set_error_handler("tonGestionnaireErreur");"

    Tu peux en fonction des types d'erreurs (E_ERROR, E_WARNING, E_PARSE, ....) faire ton traitement. Voir aussi dans le php.ini les erreurs que tu veux que le script sorte.

    A+
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  7. #7
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    En plus tu peux tracer dans un fichier, d'ou un include par ex
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  8. #8
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    Merci de ta réponse.

    Mais error_reporting(0); ne correspond qu'à l'affichage, et set_error_handler("tonGestionnaireErreur"); pose également le problème de redéfinition d'une fonction (mais, au moins, j'aurais l'affichage en temps réel)

    EDIT : j'ai tenté d'implémenter ta solution, mais j'ai tout de même l'erreur (que j'ai volontairement placée dans le script) qui interrompt le script(call to undefined function)
    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
    21
    22
        set_error_handler('run');
        function run($first_loop=false)
        {
            if (!$first_loop)
            {
                send("PRIVMSG $MAIN_CHAN Erreur fatale interceptée. Code d'erreur :".error_get_last());
                send("PRIVMSG $MAIN_CHAN Le noyau a été stoppé. Veuillez le mettre à jour et le relancer");
                while (!preg_match("#:([^!]+)!([^@]+@[^ ]+) PRIVMSG ([^ ]+) :.restartengine$#", get()))
                {
                    usleep(2000000);    // 2 secondes
                }
                send("PRIVMSG $MAIN_CHAN Tentative de redémarrage du noyau avec le nouveau code");
            }
            $FIRST_LOOP=false;
            while (!$ORDER_TO_SHUTDOWN)
            {
                $RELOAD_ENGINE=false;
            refresh_cache();
                    include("engine.php");
            }
        }
        run(true);

  9. #9
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    également le problème de redéfinition d'une fonction
    je comprends pas (c ton autre post qui pose pb aussi)

    Et sinon ton gestionnaire d'erreurs je ne l'aurais pas fait comme cela ....

    La fonction de gestion des erreurs remplace l'anciennne et doit traiter des arguments (N° erreur, message Erreur, ligne du script etc ....).
    La tienne est une fonction standart d'un traitement particulier !!!!


    Ou alors j'ai rien compris (ce qui est sûement le cas je crois)

    Bonne chance
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  10. #10
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    Bon, en gros, je veux avoir le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while (1)
    {
       try
       {
          include('engine.php');
       }
       catch (/* toutes les erreurs, même les fatales */)
       {
          while (get()!='relancer')
             usleep(200000);
       }
    }

  11. #11
    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 778
    Points
    17 778
    Par défaut
    Une erreur n'est pas une exception : vous ne l'intercepterez pas par un try/catch (à moins de redéfinir un gestionnaire d'erreur levant une exception).

    Mais toute erreur fatale, comme l'indique son nom, n'est pas récupérable : ça signifie que PHP est incapable de gérer la situation qu'il rencontre et met donc fin au script.

  12. #12
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    Merci de la réponse.
    Je connais la différence entre une erreur et une exception.

    Mais lever une exception pour une fonction inexistante ou un Parse Error, j'ai peur que ce soit impossible...


    Et puis, je ne vois pas en quoi c'est fatal pour PHP, puisqu'il suffirait de lui dire quoi faire dans ce cas (suffirait est un bien grand mot)

  13. #13
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    Alors là, y'a un truc que j'ai pas compris : j'ai mis vos différents scripts en commentaire, mais maintenant, quand y'a une erreur (par exemple un Parse Error) survenue PENDANT l'exécution du script, une de mes fonctions, appellée shutdown est appellé (elle sert à sauvegarder les données, et à arrêter le script).

    J'ai lu tout mon code-source, mais elle n'est appellée nul part ailleurs que dans mes switchs...

    EDIT : arf, j'ai compris : c'est en fait le destructeur de mes classes qui est appellé (après la fatal error...)
    Y'a peut-être moyen de se servir de ça...

Discussions similaires

  1. Arrêt du job parent suite à une erreur du job fils
    Par cutkiller042 dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 20/08/2013, 18h04
  2. Mon script provoque une erreur et je ne comprends pas ce qui cloche !
    Par philou8 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 05/06/2011, 11h46
  3. [MySQL] aide pour un script et une erreur 101
    Par kairi084 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 29/05/2011, 11h58
  4. Jouer un son suite à une erreur lors d'une saisie
    Par marcel marie dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 10/03/2010, 11h01
  5. Trace complète dans courriel suite à une erreur
    Par mapillon dans le forum Pentaho
    Réponses: 3
    Dernier message: 19/10/2009, 22h43

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