代码之家  ›  专栏  ›  技术社区  ›  Dominic Rodger

libxml2错误处理

  •  1
  • Dominic Rodger  · 技术社区  · 16 年前

    我在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
    //.@foobar
        ^
    

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

    2 回复  |  直到 16 年前
        1
  •  7
  •   Puppe    16 年前

    函数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;
    }
    
        2
  •  0
  •   Trismegisto    16 年前

    如前所述,如果这是您的处理功能:

    #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向错误消息添加一行时都有一个解析错误。