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

GTK+ avec C & C++ Discussion :

[GMarkup] contourner les erreurs fatales


Sujet :

GTK+ avec C & C++

  1. #1
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut [GMarkup] contourner les erreurs fatales
    Bonjour.

    Je tente pour la première fois d'utiliser les GMarkup. Je progresse tranquillement mais je tombe sur un fonctionnement apparemment normal mais qui me gène. Je vous explique mon dilemme.

    Je commence par créé un GMarkupParseContext avec les flags suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      priv->markupparser.start_element = gastro_xml_start_element;
      priv->markupparser.end_element = gastro_xml_end_element;
      priv->markupparser.text = gastro_xml_text;
      priv->markupparser.passthrough = gastro_xml_passthrough;
      priv->markupparser.error = gastro_xml_error;
     
      priv->markupcontext = g_markup_parse_context_new (&priv->markupparser, G_MARKUP_DO_NOT_USE_THIS_UNSUPPORTED_FLAG|G_MARKUP_PREFIX_ERROR_POSITION, NULL, gastro_xml_destroy_notify);
    Toutes les fonctions sont correctement déclarées et tout fonctionnement pour le mieux.

    J'ai créé un fichier xml minimaliste avec une erreur volontaire sur les balises. Deux d'entre-elles se chevauchent.
    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
    <?xml version=\"1.0\" encoding=\"utf-8\" ?>
    <xml>
    <projet>
    <name>coucou</name>
    <dir>/home/gerald/projet/gastro/src/test</dir>
    <place>
    <longitude>47</place></longitude>
    <latitude>5.18
    
    
    <date>05/11/16</date>
    
    <time>22:18</time>
    
    <astromaterial></astromaterial>
    
    <astrophoto></astrophoto>
    
    </xml>
    C'est ici que survient mon problème. Je récupère bien l'erreur du parser ("Erreur à la ligne 7, caractère 22*: L'élément «*place*» a été fermé, mais l'élément actuellement ouvert est «*longitude*»") mais la fonction g_markup_parse_context_parse(); ferme l'application ! Et malheureusement la documentation semble dire la même chose !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Once an error is reported, no further data may be fed to the GMarkupParseContext; all errors are fatal.
    Y-aurait-il un moyen de garder la main ?

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Comme je vois que ce post n'inspire pas grand monde () je continue à creuser la question. Et à force de creuser, on atteint le fond . Non, pardon, on trouve la solution. Du moins une solution. Ce n'est peut être pas la seule et peut-être pas la plus simple.

    Je vous la livre. Puisque la fonction g_markup_parse_context_parse (); arrête l'application il m'est venue l'idée saugrenue de faire tourner cette fonction dans un autre processus. J'ai donc créé un thread pour l'exécuter. Et cette fois-çi je garde la main .

    Code pour créer le thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        GThread *thread;
     
        if (!(thread=g_thread_try_new (NULL, (GThreadFunc) gastro_xml_thread_context_parse, xml, error)))
          {
    	g_object_unref (xml);
    	return NULL;
          }
     
        if (!g_thread_join (thread))
          {
    	*error = g_error_copy (priv->error);
    	g_object_unref (xml);
    	return NULL;
          }
    Ce code fait partie d'un nouvel object (xml) dérivé d'un GObject. Si le thread ne peut être créé je détruis le nouvel objet. Une fois passée cette création j'attends que le thread se termine. S'il se termine correctement il renvoie le pointeur xml sinon il renvoie NULL. Le pointeur error est une donnée que je propage jusqu'à la fonction de l'utilisateur final. C'est secondaire ici.

    Et voici la fonction du thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    static gpointer
    gastro_xml_thread_context_parse (GAstroXml *xml)
    {
      GAstroXmlPrivate *priv = gastro_xml_get_instance_private (xml);
     
      if (!g_markup_parse_context_parse (priv->markupcontext, priv->text, -1, &priv->error))
        return NULL;
     
      return xml;
    }
    Soit g_markup_parse_context_parse () plante ou bien le fichier comporte une erreur non fatale. Le thread renvoie NULL. Sinon il renvoie le pointeur xml transmis.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/10/2013, 15h54
  2. Erreur fatale dans les DDE
    Par carolu dans le forum SAS Base
    Réponses: 10
    Dernier message: 05/05/2011, 17h17
  3. [PHP 5.3] Intercepter les erreurs fatales
    Par kaboume dans le forum Langage
    Réponses: 10
    Dernier message: 27/08/2010, 17h13
  4. Eviter les erreurs fatales lors d'un parsing
    Par kij dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 09/03/2010, 10h36
  5. [PHP 5.2] Logger les erreurs fatales sans les afficher
    Par max-mag dans le forum Langage
    Réponses: 3
    Dernier message: 15/05/2009, 12h00

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