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() の引数リストの末尾にある 3 つのドットは、可変量の引数を取ることを意味します。それらを印刷できるようにするには、次のようにすることができます(テストされていません):

#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* にキャストされたポインタがある場合は、それを最初の引数として配置できます。

たとえば、libxml がエラー メッセージに行を追加するたびに解析エラーが発生する場合など、foo が頻繁に呼び出されることに注意してください。

于 2010-03-04T13:14:23.697 に答える