2009-11-05 6 views
1

J'écris une petite enveloppe autour de libxml2 en C++, et j'essaie de comprendre comment gérer les erreurs. Pour l'instant, disons que je veux juste les imprimer. Voici ce que j'ai à l'heure actuelle:Gestion des erreurs libxml2

Ma fonction de gestion des erreurs:

void foo(void *ctx, const char *msg, ...) { 
    cout << msg << endl; 
    return; 
} 

initialisés comme ceci:

xmlGenericErrorFunc handler = (xmlGenericErrorFunc)foo; 
initGenericErrorDefaultFunc(&handler); 

Cependant, si je parse une mauvaise XPath, je reçois cette sortie:

%s

Sans le code de gestion des erreurs, je reçois ceci:

 
XPath error : Invalid expression 
//[email protected] 
    ^

Il est évident que finalement ma gestion des erreurs fera plus que imprimer le message d'erreur (il va fichier de journalisation d'une base de données ou quelque chose), mais pour l'instant - comment puis-je obtenir cette chaîne d'erreur?

Répondre

6

Les trois points à la fin de la liste d'arguments pour votre fonction foo() signifient qu'il faut une quantité variable d'arguments. Pour être en mesure d'imprimer ceux que vous pourriez faire quelque chose comme ça (non testé):

#include <stdarg.h> 

#define TMP_BUF_SIZE 256 
void foo(void *ctx, const char *msg, ...) { 
    char string[TMP_BUF_SIZE]; 
    va_list arg_ptr; 

    va_start(arg_ptr, msg); 
    vsnprintf(string, TMP_BUF_SIZE, msg, arg_ptr); 
    va_end(arg_ptr); 
    cout << string << endl; 
    return; 
} 
+0

C'est presque là - ça me donne "expression invalide", mais pas le reste. –

+0

C'est probablement tout ce que contient le message, vous avez dit que vous aviez% s lorsque vous n'imprimiez que msg, ce qui indique qu'il n'y a plus qu'un seul argument à donner à foo() et que c'est une chaîne à imprimer. Peut-être que l'information ici peut vous aider? http://xmlsoft.org/html/libxml-xmlerror.html#xmlGenericErrorFunc – Puppe

+0

@Puppe - c'est logique. Malheureusement, la documentation n'est pas très claire sur ce qui est transmis à 'xmlGenericErrorFunc'. Ce que vous avez est assez bon pour mes fins cependant. Merci! –

0

Comme nous l'avons souligné, si cela est votre fonction de manipulation:

#define TMP_BUF_SIZE 256 
void err(void *ctx, const char *msg, ...) { 
    char string[TMP_BUF_SIZE]; 
    va_list arg_ptr; 
    va_start(arg_ptr, msg); 
    vsnprintf(string, TMP_BUF_SIZE, msg, arg_ptr); 
    va_end(arg_ptr); 
    cout << string << endl; 
    return; 
} 

vous pouvez le régler avec cette fonction libxml2

xmlSetGenericErrorFunc(NULL,gemXmlGenericErrorFunc); 

si vous avez un contexte de passer, à savoir une struct, les données, quel que soit la classe pointeur casté en void *, vous pouvez le mettre comme premier argument.

Notez que foo s'appellera beaucoup, par exemple si vous avez une erreur d'analyse chaque fois que libxml ajoute une ligne au message d'erreur.