C에서 예외 발생
- 예외 개요
- C 프로그래밍 언어에서 예외 처리
-
C에서 오류를 처리하는
setjmp()
함수 -
C에서
errno
로 오류 처리 구현 -
perror()
및strerror()
를 사용하여 오류 메시지 인쇄 - 0으로 나누기 오류 처리
이 문서에서는 C 프로그래밍 언어에서 예외 또는 오류를 처리하는 방법에 대해 설명합니다.
예외 개요
0으로 나누려는 시도는 프로그램이 실행되는 동안 발생할 수 있는 비정상적인 시나리오에 대한 반응인 예외를 트리거할 수 있는 상황의 예입니다.
제어는 예외
의 도움으로 프로그램의 한 섹션에서 다른 섹션으로 전달될 수 있습니다.
C 프로그래밍 언어에서 예외 처리
C가 오류 처리(예외 처리라고도 함)에 대한 직접적인 지원을 제공하지 않더라도 C에서 오류 처리를 수행할 수 있는 방법이 있습니다. 우선 문제를 방지하려면 프로그래머가 예방 조치를 취하고 반환된 값을 검사해야 합니다. 기능에 의해.
오류가 발생하면 C 함수에 대한 많은 호출이 -1
또는 NULL
값을 반환합니다. 따라서 이러한 반환 값에 대한 빠른 테스트를 수행하는 것은 예를 들어 if
문을 사용하여 빠르고 효율적으로 수행할 수 있습니다.
C에서 오류를 처리하는 setjmp()
함수
setjmp()
함수를 사용하여 다른 프로그래밍 언어의 예외 처리 기능을 시뮬레이션할 수 있습니다. setjmp()
가 처음 호출될 때 기준점은 프로그램 실행의 현재 지점에 저장됩니다.
이 참조점은 setjmp()
를 포함하는 함수가 반환되거나 종료되지 않는 한 유효하게 유지됩니다. longjmp()
를 호출하면 실행은 해당 setjmp()
호출이 발생한 지점으로 돌아갑니다.
setjmp()
의 매개변수는 jmp buf
로 실행 컨텍스트를 포함할 수 있는 유형으로 처음 실행될 때(반환점을 설정하는 경우) 0
을 반환합니다. longjmp()
에 제공된 값은 longjmp()
가 호출될 때 프로그램이 두 번째로 수행될 때 반환됩니다.
이전에 setjmp()
에 제공된 jmp buf
는 반환 값으로 setjmp()
에 전달되어야 하는 값과 함께 longjmp()
에 대한 입력으로 필요합니다.
깊게 중첩된 함수 호출에서 실패가 발생하면 반환하려는 위치로 반환 값을 다시 확인하는 것이 번거로울 수 있습니다. 여기에서 setjmp()
및 longjmp()
가 가장 유용합니다.
소스 코드:
#include <setjmp.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int value;
jmp_buf environment;
value =
setjmp(environment); // value is set to 0 the first time this is called
if (value != 0) {
printf("You have just executed a longjmp call, and the return value is %d.",
value); // now, value is 1, passed from longjmp()
exit(0);
}
puts("Performing longjmp call\n");
longjmp(environment, 1);
return (0);
}
출력:
Performing longjmp call
You have just executed a longjmp call, and the return value is 1
C에서 errno
로 오류 처리 구현
C에서 함수 호출이 실행될 때 errno
라는 변수는 발생한 문제를 확인하는 데 사용할 수 있는 코드(값)의 자동 할당을 받습니다. 이 코드는 오류가 발생한 위치를 정확히 찾아내는 데 사용할 수 있습니다.
어떤 함수를 호출했을 때 어떤 에러가 발생했는지 알려주는 전역 변수로 errno.h
헤더 파일에 명시되어 있습니다. 다양한 종류의 오류는 errno
변수에 대한 고유 코드 또는 값으로 표시됩니다.
다음은 각각 특정 의미에 해당하는 많은 고유한 errno
값 목록입니다.
errno 값 |
에러 메시지 |
---|---|
1 | 작동이 허용되지 않습니다 |
2 | 해당 파일 또는 디렉토리 없음 |
삼 | 해당 프로세스 없음 |
4 | 중단된 시스템 호출 |
5 | I/O 오류 |
6 | 해당 기기 또는 주소가 없습니다. |
7 | 인수 목록이 너무 깁니다. |
8 | 실행 형식 오류 |
9 | 잘못된 파일 번호 |
10 | 하위 프로세스 없음 |
11 | 다시 시도하십시오 |
12 | 메모리 부족 |
13 | 권한 거부됨 |
소스 코드:
#include <errno.h>
#include <stdio.h>
int main() {
FILE* fp;
fp = fopen("abc.txt", "r");
printf("The value of errno is: %d\n", errno);
return 0;
}
출력:
The value of errno is: 2
이 경우 errno
는 2로 설정되며 해당 이름을 가진 파일이나 디렉토리가 없음을 나타냅니다.
perror()
및 strerror()
를 사용하여 오류 메시지 인쇄
발생한 오류 종류는 위에서 얻은 errno
값으로 표시됩니다.
오류 설명을 표시해야 하는 경우 오류 번호
에 연결된 텍스트 메시지를 표시하기 위해 두 가지 기능을 사용할 수 있습니다.
perror()
는 제공한 문자열을 표시하고 공백을 삽입한 다음 콜론을 삽입하고 마지막으로 errno
값을 설명합니다. strerror()
는 errno
의 현재 값에 대한 설명을 나타냅니다.
소스 코드:
#include <errno.h>
#include <stdio.h>
#include <string.h>
int main() {
FILE *fp;
fp = fopen(" abc.txt ", "r");
printf("The value of errno is: %d\n", errno);
printf("The error message is: %s\n", strerror(errno));
perror("perror Message");
return 0;
}
출력:
The value of errno is: 2
The error message is: No such file or directory
Message from perror: No such file or directory
0으로 나누기 오류 처리
오류나 예외를 처리할 때 이것은 논의를 위해 제기되는 가장 일반적인 문제입니다.
종종 다음과 같은 수학적 주장을 제시합니다.
c = a / b;
그러나 우리는 어떤 상황에서는 b
의 값이 0
이 될 가능성이 있다는 사실을 자주 잊습니다.
정수를 제로
로 나누는 것은 수학에서 허용되지 않습니다. 사람들은 종종 해결책에 결코 도달할 수 없다고 믿으며, 이는 해결책이 무한하다는 것을 의미합니다.
불행히도 이것은 사실이 아닙니다. 이 특정 시나리오에서 올바른 응답은 지정되지 않음
입니다. C의 예외 및 오류 관리 원칙을 사용하여 다음은 이 문제를 해결할 프로그램입니다.
소스 코드:
#include <stdio.h>
#include <stdlib.h>
int main() {
int dividend;
int divisor;
int quotient;
printf("Enter the value for dividend: ");
scanf("%d", ÷nd);
printf("Enter the value for divisor: ");
scanf("%d", &divisor);
if (divisor == 0) {
fprintf(stderr, "\nDivision by zero is not possible!\n");
exit(-1);
}
quotient = dividend / divisor;
fprintf(stderr, "The value of quotient: %d\n", quotient);
exit(0);
return 0;
}
출력:
제로
값을 입력하십시오.
Enter the value for dividend: 100
Enter the value for divisor: 0
Division by zero is not possible!
0이 아닌 값을 입력합니다.
Enter the value for dividend: 100
Enter the value for divisor: 5
The value of quotient: 20
I am Waqar having 5+ years of software engineering experience. I have been in the industry as a javascript web and mobile developer for 3 years working with multiple frameworks such as nodejs, react js, react native, Ionic, and angular js. After which I Switched to flutter mobile development. I have 2 years of experience building android and ios apps with flutter. For the backend, I have experience with rest APIs, Aws, and firebase. I have also written articles related to problem-solving and best practices in C, C++, Javascript, C#, and power shell.
LinkedIn