2009-11-05 2 views
1

C++에서 libxml2에 대한 작은 래퍼를 작성하고 있으며 오류를 처리하는 방법을 찾으려고합니다. 지금은 그냥 인쇄하고 싶다고 가정 해 봅시다. 여기에 내가 현재 가지고있는 작업은 다음과 같습니다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()의 인수 목록 끝에있는 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; 
} 
+0

거의 다 도착했습니다. "유효하지 않은 표현"이 표시되지만 나머지는 표시되지 않습니다. –

+0

그게 아마 모든 메시지에 담겨있을 것입니다. 여러분은 단지 msg를 인쇄했을 때 % s를 가지고 있다고 말했습니다. 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이 오류 메시지에 행을 추가 할 때마다 구문 분석 오류가있는 경우입니다.