C 언어 에러 처리 마스터하기: 모범 사례와 기법
C 프로그래밍은 직접적인 에러 처리 지원을 제공하지 않지만, 시스템 프로그래밍 언어로서 반환 값을 통해 하위 수준 접근을 제공합니다. 대부분의 C 또는 Unix 함수 호출은 에러 발생 시 -1 또는 NULL을 반환하고 전역 변수인 에러 코드 errno를 설정합니다. 이 변수는 함수 호출 중 에러가 발생했음을 나타냅니다. 다양한 에러 코드는 <error.h> 헤더 파일에 정의되어 있습니다.
따라서 C 프로그래머는 반환 값을 확인하고 반환 값에 따라 적절한 조치를 취할 수 있습니다. 프로그램을 초기화할 때 errno를 0으로 설정하는 것이 좋은 관행입니다. 값 0은 프로그램에 에러가 없음을 나타냅니다.
errno, perror(), strerror()
C 프로그래밍 언어는 perror()와 strerror() 함수를 제공하여 errno와 관련된 텍스트 메시지를 표시할 수 있습니다.
perror() 함수는 전달받은 문자열을 출력한 후 콜론, 공백, 현재 errno 값의 텍스트 표현을 차례로 출력합니다.
strerror() 함수는 현재 errno 값의 텍스트 표현을 가리키는 포인터를 반환합니다.
존재하지 않는 파일을 열려고 시도하여 에러 조건을 시뮬레이션해 보겠습니다. 여기서는 두 함수의 사용법을 모두 보여드리지만, 에러 출력을 위해 하나 이상의 방식을 사용할 수 있습니다. 두 번째 중요한 점은 모든 에러 출력을 위해 stderr 파일 스트림을 사용해야 한다는 것입니다.
#include <stdio.h>
#include <errno.h>
#include <string.h>
extern int errno;
int main() {
FILE *pf;
int errnum;
pf = fopen("unexist.txt", "rb");
if (pf == NULL) {
errnum = errno;
fprintf(stderr, "Value of errno: %d\n", errno);
perror("Error printed by perror");
fprintf(stderr, "Error opening file: %s\n", strerror(errnum));
} else {
fclose(pf);
}
return 0;
}
위 코드를 컴파일하고 실행하면 다음과 같은 결과가 나옵니다.
Value of errno: 2
Error printed by perror: No such file or directory
Error opening file: No such file or directory
0으로 나누기 에러
숫자를 나눌 때 프로그래머가 제수가 0인지 확인하지 않아 런타임 에러가 발생하는 것이 흔한 문제입니다.
아래 코드는 나누기 전에 제수가 0인지 확인하여 이 문제를 해결합니다.
Live Demo
#include <stdio.h>
#include <stdlib.h>
main() {
int dividend = 20;
int divisor = 0;
int quotient;
if (divisor == 0) {
fprintf(stderr, "Division by zero! Exiting...\n");
exit(-1);
}
quotient = dividend / divisor;
fprintf(stderr, "Value of quotient : %d\n", quotient);
exit(0);
}
위 코드를 컴파일하고 실행하면 다음과 같은 결과가 나옵니다.
Division by zero! Exiting...
프로그램 종료 상태
성공적인 작업 후 프로그램이 종료될 때 EXIT_SUCCESS 값으로 종료하는 것이 일반적인 관행입니다. 여기서 EXIT_SUCCESS는 매크로로 0으로 정의됩니다.
프로그램에 에러 조건이 있어 종료하는 경우에는 EXIT_FAILURE 상태(값 -1)로 종료해야 합니다. 위 프로그램을 다음과 같이 다시 작성해 보겠습니다.
Live Demo
#include <stdio.h>
#include <stdlib.h>
main() {
int dividend = 20;
int divisor = 5;
int quotient;
if (divisor == 0) {
fprintf(stderr, "Division by zero! Exiting...\n");
exit(EXIT_FAILURE);
}
quotient = dividend / divisor;
fprintf(stderr, "Value of quotient : %d\n", quotient);
exit(EXIT_SUCCESS);
}
위 코드를 컴파일하고 실행하면 다음과 같은 결과가 나옵니다.
Value of quotient : 4