2010-08-11 5 views
3

exit()를 통해 내 프로그램이 비정상적으로 종료 된 경우 오류 코드를 반환합니다. 표준 상황에서, 나는 단지 근본적인 errno (예를 들어, 실패한 malloc에 ​​대한 ENOMEM 등)를 리턴한다. 그러나 시스템에 러노가 정의되어 있지 않은 이유 때문에 종료해야하는 경우도 있습니다.내 사용자 정의 오류 번호를 지정하는 방법

어떤 오류 값을 반환해야 기존 오류 값과 충돌하지 않습니다. 아니면 내가 엉덩이를 전부하고있는거야?

편집 : 질문이 명확하지 않으면 죄송합니다. 나는 열거 등 (그들은 오류 코드를 정의하기위한 메커니즘입니다)에 대해 이야기하지 않습니다. 나는 표준과 충돌하지 않고 취할 수있는 가치의 범위에 대해 이야기하고있었습니다.

내가 몰랐던 이유는 프로그램이 8 비트 상태 만 반환 할 수 있다는 것이 었습니다. 그래서 그것은 @r이 옳은 것처럼 보입니다. 그것은 아마도 약간의 조정만으로도 어쩌면 모든 표준 것들을 감당할 수 있습니다. 그래서 1/0입니다 :

답변

5

리턴 코드의 너비는 보통 8 비트로 제한되어 있으므로 매우 작습니다. 따라서 많은 정보를 저장할 수 없습니다. 정말 당신의 프로그램이 셸 스크립팅에서 사용하기위한 것이 아닌 한, 0/1 (성공/실패) 이외의 종료 코드는 신경 쓰지 않을 것입니다.이 경우 잠재적 셸 스크립트가 검사해야 할 오류 케이스를 알아 내야 할 것입니다 (예 : "일치하지 않음"대 "검색하는 동안 자원이 소모 됨").

1

enum을 사용하여 오류 코드를 정의 해 보셨습니까?

어쨌든 here에 대한 흥미로운 토론이 있습니다.

1

몇 가지 방법이 있습니다.

1) 열거 형 - 다음과 같은 방법으로 수행 할 수 있습니다. 그룹에 필요할 때마다 다른 오류 코드를 추가 할 수있는 유연성이 있습니다. 사용자 인증, 파일 액세스, API 오류 등 관련 오류를 말

enum 
{ 
ERROR_GROUP_1 =100,// This gives 99 error codes for a particular group, can be initialised to negative value too. 
GROUP1_1, 
. 
. 
ERROR_GROUP_2 = 200 
GROUP2_2, 
. 
. 
and so on 
}; 

2) 사용 전 처리기 지시어

#define ERROR_CODE_START 00000000L

#define ERROR_CODE_1 (ERROR_CODE_START + 1)

3) (int)로 음의 반환 값 만 이것은 참조가 가치에 대해 잘 문서화되어야하므로 많은 고통이 될 것입니다.

4) GError과 같은 구조를 만들 수 있습니다. 모든 API에서이 구조에 대한 참조를 전달하고이를 채 웁니다. NULL이 아닌 경우 호출자는 API에 설정 될 오류 코드 및 문자열을 확인할 수 있습니다.

3

기존 오류와 충돌하지 않도록 반환 할 오류 값은 무엇입니까? 아니면 내가 엉덩이를 전부하고있는거야?

간단하게 유지하십시오. 오류 코드에 대한 가장 중요한 테스트 (일반 함수에도 유효 함)는 호출자가 수행 할 수있는 것입니다. 나는 프로젝트가 사람들이 수백 가지/수천 가지의 오류 코드를 도입하여 각각의 고유 한 경우에 대해 프로젝트가 오류 처리에서 완전히 혼란을 일으킨다는 것을 보았습니다. 모든 함수/SQL 문에 고유 한 종료 코드를 제공하려고했습니다. 그리고 오류 처리 (error handling)는 정확히 종료 코드와 관련된 당사자입니다.

리턴 코드에 대한 개인적인 규칙은 오류 처리에 유용하다는 것을 확인하는 것입니다. 예시하기 위해, 배치 프로그램에 대한 그와 같은 상태 코드를 살짝 수도 :

  • 0 - OK,
  • 1 - 내부 그러나 아마 복구 할 수없는 오류 (예 : 메모리 할당 오류, 다른 배치를 죽이고 다시 시작하려고),
  • 2 - 설정에서 치명적인 오류 (다시 시작이 도움이되지 않습니다),
  • 3 - 입력 데이터의 치명적인 오류 (,) 다시 시도 입력을 대체
  • 4 - 출력 얻었다 디스크 전체 오류 (청소/tmp를 , 다시 시도하십시오).

오류 코드는 호출자가 아닌 호출자의 POV를 고려해야한다는 것을 강조하는 예에 불과합니다. 예를 들어 전체/부분 자동화가 대상이 아니며 사용자가 로그 파일을 분석해야하는 경우 0 또는 1을 반환하는 것으로 충분합니다.

+0

"피 호출자가 수행 할 수있는 것"이라는 문구는 "호출자가 수행 할 수있는 것"이라고해야합니까? 그렇다면 편집하십시오. – user1284631

+0

종료 코드는 하나의 오류 코드 (errno global)가 완전히 다른 것입니다. 그들은 1 비트 (32 비트 이상)에 대해 더 넓습니다. arch/mips/include/asm/errno.h # EMAXERRNO를 정의하므로 위에서 시작해도 좋습니다. (안타깝게도 다른 커널 errno.h는 #defines를 정의하지 않는다) – Urhixidur

1

Posix 호환 시스템에서는 wait() 시스템 호출만으로 프로그램의 반환 값의 하위 8 비트를 가질 수 있기 때문에 0에서 255 범위 밖의 어떤 숫자도 반환하지 않습니다. (또는 가능하게는 16 비트).

실제로는 소수의 코드 만 원할 것입니다. 아마도 0과 1 일 수도 있습니다. 더 많은 정보는 stderr를 통해보다 유용한 (사람에게) 텍스트 형식으로 전달 될 수 있습니다.

관련 문제