2009-11-05 2 views
1

Я пишу небольшую обертку вокруг libxml2 в C++, и я пытаюсь разобраться, как обрабатывать ошибки. Пока, скажем, я просто хочу распечатать их. Вот что у меня есть на данный момент:libxml2 обработка ошибок

Моя функция обработки ошибок:

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

инициализируется так:

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

Однако, если я разобрать плохой XPath, я получаю этот выход:

%s

Без кода обработки ошибок, я получаю это:

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

Очевидно, в конце концов, моя обработка ошибок будет делать больше, чем просто распечатать сообщение об ошибке (он будет записывать их в базу данных или что-то), но сейчас - как я могу получить эту строку ошибки?

ответ

6

Три точки в конце списка аргументов для функции foo() означают, что она принимает переменное количество аргументов. Для того, чтобы быть в состоянии напечатать те, которые вы могли бы сделать что-то вроде этого (не проверял):

#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

Это почти что есть - это делает меня «Недопустимое выражение», но не все остальное. –

+0

Это, вероятно, все сообщение содержит, вы сказали, что у вас есть% s, когда вы печатали только сообщение msg, что указывает на то, что для foo() есть только один аргумент, и это строка для печати. Может быть, информация здесь может вам помочь? http://xmlsoft.org/html/libxml-xmlerror.html#xmlGenericErrorFunc – Puppe

+0

@Puppe - это имеет смысл. К сожалению, документация еще не все о том, что передается в 'xmlGenericErrorFunc'. То, что у вас есть, достаточно хорошо для моих целей. Благодаря! –

0

Как уже отмечалось, если это ваша функция обработки:

#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; 
} 

вы можете установить его с помощью этой функции libxml2

xmlSetGenericErrorFunc(NULL,gemXmlGenericErrorFunc); 

, если у вас есть контекст, чтобы пройти, то есть некоторая структура, данные, класс любого указателя отлит к мочеиспусканию *, вы можете поместить его в качестве первого аргумента.

Обратите внимание, что foo будет называться много, например, если у вас есть ошибка синтаксического анализа каждый раз, когда libxml добавляет строку в сообщение об ошибке.

Смежные вопросы