2011-11-19 3 views
3

파일에서 특정 번호의 Foo을 읽어야하는 할당이 있습니다. Foo 중 하나에 대해 파일 내부의 데이터가 잘못 작성된 경우 Foo 중 정확히 어느 것을 수정해야하는지 (예 :) 신호를 보내는 일반적인 방법은 무엇입니까?오류가 발생하는 위치를 추적하는 일반적인 C 관용구

내 코드는 다음과 같이 보입니다 :

Foo foos[50]; 
FILE *file = fopen(...); 
int i; 

for (i = 0; i < sizeof(foos); ++i) 
{ 
    if (readFoo(&foos[i], file) != 1) 
     break; 
} 

읽으면 1를 반환 할 것입니다 readFoo 기능이 성공을; 그렇지 않은 경우 음수를 반환하고 무엇이 잘못되었지만 오류가 어디에 있는지를 지정하지 않는 stderr에 오류를 인쇄합니다. (깨끗하게) 이것을 어떻게 구현해야 사용자에게 i의 값을 전달할 수 있습니까?

C++에서는 예외가 있습니다. C에서 나는 (무엇인가를 잘 작성하지 않을 때마다 따라 error을 설정합니다 readFoo)이 같은 일을 생각 : 어떤 다른 방법

/* These go in a source file */ 
const char *error = NULL; 
const char error1[] = "Error 1 occurred."; 
const char error2[] = "Error 2 occurred."; 

const char *getLastError() { 
    return error; 
} 

거기이 문제를 해결하기 위해?

답변

2

"깨끗한"방법은 전화 사이트에서 오류보고를하는 것입니다. 즉, 다음과 같이하십시오.

즉, readFoo는 버퍼를 stderr에 쓰지 않고 오류 메시지로 채 웁니다.

+0

그건 좋은 생각 같아. –

1

표준 C는 오류를 구분하기 위해 errno을 제공합니다. 원한다면 똑같이 할 수 있습니다. 당신이 이미 루프를 가지고 있고 무엇이 i인지 알 것 같습니다. 당신은 그냥 할 수 없습니다 :

if (readFoo(&foos[i], file) != 1) { 
    fprintf(stderr, "Read error on foo #%d\n", i); 
    break; 
} 
+0

물론 할 수는 있지만 "Foo # 2 : Foo # 2"대신 "Foo # 2 : Incorrect value"와 같은 메시지를 표시하고 싶습니다. :) ('readFoo'는'i'의 값을 출력하기 전에 메시지에 대한 설명을 인쇄합니다.) –

+1

이렇게하려면'readFoo'를 수정해야합니다. 이것이 받아 들일 수있는 옵션이라면,'i'를 전달하고,'readFoo'가 볼 수있는 전역에'i'를 저장하거나, readFoo에 정적 변수를 저장하여 호출 된 횟수를 계산할 수 있습니다. –

+0

이상적이지 않습니다. 'readFoo'는 여러개의'Foo'를 읽었 음을 신경 써야합니다. :) –

2

유닉스 계열 운영체제에서 잘 알려진 관용구는 errno(3)이며, 시스템 호출 오류에 -1를 반환하고 특정 오류 유형을 지정하는 전역 변수를 설정합니다 곳. 이것이 여러 스레드에서 잘 수행되지 않았기 때문에 원래 아이디어는 스레드 당 오류 코드를 검색하는 함수에 대한 호출로 정의되도록 errno으로 전복되었습니다.

그런 다음 POSIX threads API은 성공하면 0을 반환하고 실패하면 오류 코드를 반환합니다. 필자의 견해로는 이것이 사용자 영역 코드에 대한 오류보고의 선호되는 방법이며이를 따르는 것이 좋습니다.

관련 문제