System Call Error Handling
UNIX 시스템 레벨의 함수에 에러가 발생하면, 보통 -1을 반환하여 무엇이 잘못되었는지를 알 수 있도록 전역 변수 errno를 설정한다. 프로그래머는 항상 에러를 체크해야 하지만 건너뛰는 경우가 많다. 왜냐하면 에러 체크를 하면 코드가 흐트러지고 읽기 어려워지기 때문이다. 예를 들어 Linux fork 함수를 호출할 때 에러를 확인하는 방법은 다음과 같다.
if ((pid = fork()) < 0) {
fprintf(stderr, "fork error: %s\n", strerror(errno));
exit(0);
}
fork() 함수의 반환 값이 -1이면 오류가 발생한 것으로 위와 같이 처리한다.
strerror 함수는 errono의 특정 값과 관련된 에러를 설명하는 문자열을 반환한다.
Error-reporting functions
Error-reporting function을 정의하면 위 코드를 어느 정도 간략화할 수 있다.
void unix_error(char *msg) /* Unix-style error */
{
fprintf(stderr, "%s: %s\n", msg, strerror(errno));
exit(0);
}
if ((pid = fork()) < 0)
unix_error("fork error");
Error-handling Wrappers
Stevens 스타일의 Error-handling wrapper를 사용하여 위 코드를 더욱 단순화할 수 있다.
foo라는 함수가 있다면 같은 인자를 가지고 첫 글자가 대문자인 wrapper 함수 Foo를 정의한다.
wrapper 함수는 기본 함수를 호출하여 오류를 확인하고 문제가 있으면 종료한다.
pid_t Fork(void)
{
pid_t pid;
if ((pid = fork()) < 0)
unix_error("Fork error");
return pid;
}
Wrapper 함수를 사용하여 fork()는 1개의 간단한 코드로 줄어든다.
pid = Fork();