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 :

Try catch Sur SimpleXMLElement (PHP 5.5.12) [PHP 5.5]


Sujet :

Langage PHP

  1. #1
    Membre confirmé Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Points : 492
    Points
    492
    Par défaut Try catch Sur SimpleXMLElement (PHP 5.5.12)
    Bonjour à tous,
    Je suis en train de tester les exceptions en php.
    Lorsque j'utilise le code suivant, il ne se passe rien si ce n'est l'affichage du Warning sur la page.
    L'erreur n'est pas traitée par le système.

    La variable $xml est une chaine xml que j'ai mal formé exprès pour générer une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    try {
        $doc = new SimpleXMLElement($xml);
        echo "Yup<br />";
    } catch (Exception $e) {
        print_r($e."<br />");
    }
    Est ce que qqun peut m'expliquer pourquoi ?
    Un problème de configuration du serveur ?

    Merci

  2. #2
    Membre confirmé Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Points : 492
    Points
    492
    Par défaut
    Je me réponds à moi même si ca peut aider qqun.
    Le traitement des erreurs doit être spécifique à cet objet.
    Apparemment, le mécanisme TRY / CATCH de PHP est spécifique à PHP et ne ressemble pas tout à fait au traitement des erreurs des autres langages.

    Voici la solution pour traiter ce genre de problème. En l’occurrence, un fichier xml mal formé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
              $xml = $_POST['articles'];
                libxml_use_internal_errors(true);
                $sxml = simplexml_load_string($xml);
                if ($sxml === false) {
                    echo "Erreur lors du chargement du XML<br />";
                    foreach(libxml_get_errors() as $error) {
                        echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;", $error->message."<br />";
                    }
                    exit;
                }
    http://php.net/manual/fr/simplexml.examples-errors.php

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Le Try/Catch/finally est similaire au try/catch/finally des autres langages, et s'applique aux exceptions, pas aux erreurs.

    Mais c'est SimpleXMLElement qui a une gestion bizarre des exceptions. C'est PHP, parfois mieux vaut pas se demander pourquoi :-)

  4. #4
    Membre confirmé Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Points : 492
    Points
    492
    Par défaut
    Merci pour cette petite précision.

  5. #5
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 104
    Points : 4 454
    Points
    4 454
    Par défaut
    Citation Envoyé par Tsilefy Voir le message
    C'est PHP, parfois mieux vaut pas se demander pourquoi :-)


    bien sur que si les exceptions fonctionnent très bien en php , a tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php 
    libxml_use_internal_errors(true); 
    try{ 
        $xml = new SimpleXMLElement('<html></test>'); 
    } catch (Exception $e){ 
        print_r($e);
    } 
    ?>
    $moi= ( !== ) ? : ;

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    En PHP en général, oui. Avec SimpleXMLElement, non. La preuve, il faut que tu ajoutes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libxml_use_internal_errors(true)
    Jamais dans aucun autre langage (ou même dans PHP) je n'ai vu ça, mais je suis toujours prêt à apprendre de nouvelles choses :-)
    Rends-toi compte:
    1- il faut initialiser les exceptions pour pouvoir les utiliser
    2- on mélange fonction et objet. À la limite une classe SimpleXMLErrorException mais là...
    3- c'est une fonction de libxml, pas de SimpleXMLElement. C'est donc une dépendance cachée. À partir du moment où je manipule l'interface de SimpleXMLElement, je ne devrais pas avoir à faire une configuration de bas niveau pour obtenir quelque chose d'aussi fondamental que les exceptions.

    Heureusement, c'est un cas très particulier. Et quand je dis ironiquement c'est PHP, c'est sans doute parce que c'est en raison d'un problème de compatibilité rétroactive (avec libxml), qui est la cause de 90% des bizzareries de PHP (mais aussi la raison de son succès en général).

  7. #7
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 104
    Points : 4 454
    Points
    4 454
    Par défaut
    @Tsilefy
    au moins je répond + intelligemment que
    C'est PHP, parfois mieux vaut pas se demander pourquoi :-)
    si ca ne marche pas c'est de la faute de php c'est possible parfois (très rarement) mais avant de prétendre cela on fait au minimum un petit test .

    Cette ligne ajoutée est un détail et n'est pas la question du sujet : SimpleXMLElement ne déclenche pas d'exception ?.
    il ne faut pas obligatoirement ajouter libxml_use_internal_errors() simplement c'était un moyen de dévaliser les erreurs ; avec ou sans, l'exception est très bien gérée.

    Si libxml te gène tant que cela.je pouvais aussi écrire : error_reporting(E_ERROR|E_STRICT) ou ini_set('display_errors','1') ou utiliser set_exception_handler() si ce n'est pas fait par le framework ou en production.

    Oui SimpleXMLElement déclenche des erreurs et des exceptions en même temps et donc oui elle a un problème ... mais je dirais que c'est plus une gestion bizarre des erreurs et je penche comme toi pour un sombre problème de compatibilité rétroactive (mais c'est une classe pourtant!?)
    $moi= ( !== ) ? : ;

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

Discussions similaires

  1. Try Catch (?) sur une erreur d'accès mémoire
    Par Jflop91 dans le forum Langage
    Réponses: 1
    Dernier message: 26/03/2013, 15h36
  2. TRY/CATCH sur xp_cmdshell et xp_delete_file
    Par Kaoru-tabris dans le forum Développement
    Réponses: 8
    Dernier message: 14/09/2010, 17h05
  3. Gérer un try catch sur un scan.nextInt() en boucle
    Par ermite67 dans le forum Langage
    Réponses: 3
    Dernier message: 16/06/2010, 17h14
  4. Précision sur le try/catch
    Par Faiche dans le forum Langage
    Réponses: 2
    Dernier message: 13/07/2007, 21h18
  5. Erreur de runtime sur un try ... catch
    Par Floréal dans le forum C++
    Réponses: 14
    Dernier message: 09/09/2005, 19h15

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