C에서 예외 발생

Waqar Aslam 2023년10월12일
  1. 예외 개요
  2. C 프로그래밍 언어에서 예외 처리
  3. C에서 오류를 처리하는 setjmp() 함수
  4. C에서 errno로 오류 처리 구현
  5. perror()strerror()를 사용하여 오류 메시지 인쇄
  6. 0으로 나누기 오류 처리
C에서 예외 발생

이 문서에서는 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", &dividend);

  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
작가: Waqar Aslam
Waqar Aslam avatar Waqar Aslam avatar

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

관련 문장 - C Exception