2009-11-05 2 views
3

사용자 정의 인쇄 오류 기능을 만드는 가장 좋은 방법은 무엇인지 궁금합니다.오류 메시지 인쇄

예를 들어 내가 헤더 파일에이 같은 일부 # 정의가 있습니다

#define SOCKET_ERR 0 
#define BIND_ERR 1 
#define LISTEN_ERR 2 
etc 

그리고 어쩌면이 같은이를 사용하여 :

if(/*something has gone wrong with socket*/) 
{ 
    print_error(SOCKET_ERR); 
} 

print_error(int error) 
{ 
    if(error == 0) 
    { 
     printf("Socket failure\n"); 
    } 
} 

을하지만, 나는이 완벽한을 생각하고 싶지 않아 훨씬 더 나은 것을해라. 어쩌면 좀 더 전문적이고 어쩌면 확장 성이있는 것일 수도 있습니다. 어떤 조언을

많은 감사, 로깅을 구현하는 방법을 몇 가지 아이디어를 밖으로 log4c

+1

'fprintf (stderr, ...)'를 사용하여 오류를보고합니다 (또는 적어도 'stdout'이 아닌 'stderr'로 작성하거나 로그 파일이나 로그 파일과 stderr 모두에 쓰십시오). –

답변

3

당신은 오류보고를 위해 variadic functions 사용을 고려할 수, 그들은 훨씬 더 다양한된다. 다음과 같이 호출 할 수 있습니다 예를

#include <stdarg.h> 
void my_error(FILE *out, const char *fmt, ...) 
{ 
    va_list ap; 
    va_start(ap, fmt); 
    vfprintf(out, fmt, ap); 
    va_end(ap); 
} 

를 들어

(참고, 내가 C99 컴파일러를 있으리라 믿고있어) :

my_error(stderr, 
    "%s: Invalid range of %ld near line %d", __func__, range, __LINE__); 

이 쉽게 그 오류 코드를 제안 다른 답변으로 묶을 수 열거 된 목록에 문자열을 정의 할 수있는 상수 배열을 정의 할 수 있습니다. 나는 그것을 독자를위한 운동으로 남겨 둘 것이다. 위의 예제를 만들기가 매우 쉽기 때문에 더 많은 인수를 허용합니다.

NB : char 버퍼 [LEN]와 같은 것을 사용하여 인쇄 된 문자열을 사용자 정의 포맷으로 만들려면 void에서 unsigned int로 변경하고 vsnprintf()가 인쇄 할 수없는 바이트 수를 반환해야합니다. 발신자에게. 위의 예제는 '안전'입니다. 여기서 정의되지 않은 길이의 형식화 된 오류 메시지가있는 스택 할당 된 버퍼를 지나치게 오버 플로우 할 염려가 없습니다. 또는 무효로 남겨두고 가능한 한 인쇄합니다 (모든 것을 인쇄 할 수 없음을 지적하면서). 이 접근법으로 되돌아 간다면 확장 된 가변 인수의 길이를 알 수 없습니다. 결국 예기치 않은 결과가보고되고있는 것입니다. :)

이 방법을 사용하면 의미 있고 유익한 오류 메시지를 전달하고 열려있는 파일에 기록하기 만하면됩니다.

이 예제에서는 기본적으로 printf() 자체에 대해 설명합니다. 나는 그것이 적응하고 확장하는 것이 얼마나 쉬운 지 보여주기 위해 그것을 게시하고있다.

+0

안녕하세요. 나는 그것이 최고의 아이디어라고 생각한다. 이 링크가 사용 된 링크를 알고 있습니까? – ant2009

+0

함수의 C99 이름은 '__FUNCTION__'이 아니라 '__func__'입니다. –

+0

@Jonathan Leffler : 네, 맞습니다. 나는 glibc 창조물 안락에 너무 익숙하게되고있다. –

3

확인합니다.

다음은 몇 가지 조언입니다. "오류가있었습니다"라고 인쇄하지 마십시오. 가능한 한 많은 정보를 제공하십시오 : 어떤 IP 주소? 에러 코드? 귀하의 코드는 무엇을 달성하려고 시도 했습니까?

오류 메시지를 작성해야 할 때 다음 질문을 해보십시오.이 오류 메시지가 나타나면 무엇을 알아야합니까? 무슨 문제를 해결하는 데 도움이 될 것인가?

+2

질문에 추가 : 누가 개발자, 사용자 등의 오류 메시지입니까?도움이되는 정보는 청중에 달려 있습니다. 다음은 GUI 오류에 대한 내용이지만 일반적으로 오류 메시지에 대한 유용한 정보가 들어 있습니다. http://developer.apple.com/mac/library/documentation/UserExperience/Conceptual/AppleHIGuidelines/XHIGWindows/XHIGWindows.html#//apple_ref/doc/uid/20000961-TPXREF23 http://msdn.microsoft.com/en-us/library/ms995351.aspx – outis

2

는 또한 같은 것을 할 수 있습니다

//Enum for the error codes 
typedef enum 
{ 
    SOCKET_ERR = 0, 
    BIND_ERR, 
    LISTEN_ERR, 
    LAST_ENTRY //This SHOULD be the last entry 
} ErrorCode; 

//Error descriptions..number of entries should match the number of entries in Enum 
const char* errorDesc[] = 
{ 
    "Socket failure", 
    "Bind failure", 
    "Listen failure", 
    "Dummy" 
}; 


void printError(ErrorCode c) 
{ 
    //Validate.. 
    if(c < LAST_ENTRY) 
    { 
     printf(errorDesc[c]); 
    } 
} 
+3

대부분의 시스템은 '오류가 아님'으로 0을 예약합니다. C99에서는 errorDesc의 초기화 프로그램의 신뢰성을 크게 향상시키는'[SOCKET_ERR] = "Socket failure"와 같은 지정된 초기화 프로그램을 사용할 수 있습니다. –