1

我正在用 C++ 围绕 libxml2 编写一个小包装器,并且正在尝试解决如何处理错误。现在,假设我只想将它们打印出来。这是我目前所拥有的:

我的错误处理功能:

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

像这样初始化:

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

但是,如果我解析错误的 XPath,我会得到以下输出:

%s

没有错误处理代码,我得到这个:

XPath 错误:无效的表达式
//.@foobar
    ^

显然,最终我的错误处理不仅仅是打印出错误消息(它会将它记录到数据库或其他东西),但现在 - 我怎样才能得到那个错误字符串?

4

2 回答 2

7

函数 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;
}
于 2009-11-05T10:17:11.270 回答
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);

如果您有要传递的上下文,即某些结构、数据、类,无论指针转换为 void*,您都可以将其作为第一个参数。

请注意, foo 会被多次调用,例如,如果每次 libxml 在错误消息中添加一行时都会出现解析错误。

于 2010-03-04T13:14:23.697 回答