산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

C++ 예외 처리

예외는 프로그램 실행 중에 발생하는 문제입니다. C++ 예외는 0으로 나누려는 시도와 같이 프로그램이 실행되는 동안 발생하는 예외적인 상황에 대한 응답입니다.

예외는 프로그램의 한 부분에서 다른 부분으로 제어를 전송하는 방법을 제공합니다. C++ 예외 처리는 try, catch,의 세 가지 키워드를 기반으로 합니다. 그리고 던지기 .

블록이 예외를 발생시킨다고 가정하면 메소드는 try 조합을 사용하여 예외를 포착합니다. 잡기 키워드. 예외를 생성할 수 있는 코드 주위에 try/catch 블록이 배치됩니다. try/catch 블록 내의 코드를 보호 코드라고 하며 try/catch를 사용하는 구문은 다음과 같습니다. -

try {
   // protected code
} catch( ExceptionName e1 ) {
   // catch block
} catch( ExceptionName e2 ) {
   // catch block
} catch( ExceptionName eN ) {
   // catch block
}

여러 catch를 나열할 수 있습니다. 시도의 경우에 대비하여 다양한 유형의 예외를 포착하는 명령문 블록은 다양한 상황에서 둘 이상의 예외를 발생시킵니다.

예외 발생

throw를 사용하여 코드 블록 내 어디에서나 예외를 throw할 수 있습니다. 성명. throw 문의 피연산자는 예외의 유형을 결정하며 모든 표현식이 될 수 있으며 표현식의 결과 유형은 throw되는 예외의 유형을 결정합니다.

다음은 0으로 나누는 조건이 발생할 때 예외를 던지는 예입니다 -

double division(int a, int b) {
   if( b == 0 ) {
      throw "Division by zero condition!";
   }
   return (a/b);
}

예외 잡기

잡기 시도 후 차단 블록은 모든 예외를 포착합니다. catch할 예외 유형을 지정할 수 있으며 이는 catch 키워드 다음에 괄호 안에 나타나는 예외 선언에 의해 결정됩니다.

try {
   // protected code
} catch( ExceptionName e ) {
  // code to handle ExceptionName exception
}

위의 코드는 ExceptionName 예외를 포착합니다. 유형. catch 블록이 try 블록에서 throw된 모든 유형의 예외를 처리하도록 지정하려면 다음과 같이 예외 선언을 묶는 괄호 사이에 줄임표 ...를 넣어야 합니다. -

try {
   // protected code
} catch(...) {
  // code to handle any exception
}

다음은 0으로 나누기 예외를 throw하고 catch 블록에서 catch하는 예입니다.

라이브 데모
#include <iostream>
using namespace std;

double division(int a, int b) {
   if( b == 0 ) {
      throw "Division by zero condition!";
   }
   return (a/b);
}

int main () {
   int x = 50;
   int y = 0;
   double z = 0;
 
   try {
      z = division(x, y);
      cout << z << endl;
   } catch (const char* msg) {
     cerr << msg << endl;
   }

   return 0;
}

const char* 유형의 예외를 발생시키기 때문에 , 그래서 이 예외를 잡는 동안 우리는 catch 블록에서 const char*를 사용해야 합니다. 위의 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다. -

Division by zero condition!

C++ 표준 예외

C++는 에 정의된 표준 예외 목록을 제공합니다. 우리 프로그램에서 사용할 수 있습니다. 이들은 아래에 표시된 부모-자식 클래스 계층 구조로 정렬됩니다. -

다음은 위의 계층 구조에서 언급된 각 예외에 대한 간단한 설명입니다. -

Sr.No 예외 및 설명
1

std::예외

모든 표준 C++ 예외의 예외 및 상위 클래스입니다.

2

std::bad_alloc

이것은 new가 던질 수 있습니다. .

3

std::bad_cast

이것은 dynamic_cast에 의해 발생될 수 있습니다. .

4

std::bad_exception

이것은 C++ 프로그램에서 예기치 않은 예외를 처리하는 데 유용한 장치입니다.

5

std::bad_typeid

이것은 typeid에 의해 발생될 수 있습니다. .

6

std::logic_error

이론적으로 코드를 읽어서 감지할 수 있는 예외입니다.

7

std::domain_error

수학적으로 유효하지 않은 도메인이 사용될 때 발생하는 예외입니다.

8

std::invalid_argument

잘못된 인수로 인해 발생합니다.

9

std::length_error

너무 큰 std::string이 생성될 때 발생합니다.

10

std::out_of_range

이것은 'at' 메서드에 의해 throw될 수 있습니다(예:std::vector 및 std::bitset<>::operator[]()).

11

std::runtime_error

이론적으로 코드를 읽어서 감지할 수 없는 예외입니다.

12

std::overflow_error

수학적 오버플로가 발생하면 throw됩니다.

13

std::range_error

범위를 벗어난 값을 저장하려고 할 때 발생합니다.

14

std::underflow_error

수학적 언더플로가 발생하면 throw됩니다.

새 예외 정의

예외를 상속하고 재정의하여 고유한 예외를 정의할 수 있습니다. 클래스 기능. 다음은 std::exception 클래스를 사용하여 표준 방식으로 자신의 예외를 구현하는 방법을 보여주는 예입니다.

라이브 데모
#include <iostream>
#include <exception>
using namespace std;

struct MyException : public exception {
   const char * what () const throw () {
      return "C++ Exception";
   }
};
 
int main() {
   try {
      throw MyException();
   } catch(MyException& e) {
      std::cout << "MyException caught" << std::endl;
      std::cout << e.what() << std::endl;
   } catch(std::exception& e) {
      //Other errors
   }
}

이것은 다음과 같은 결과를 낳을 것입니다 -

MyException caught
C++ Exception

여기, 무엇() 예외 클래스에서 제공하는 공용 메서드이며 모든 자식 예외 클래스에서 재정의되었습니다. 예외의 원인을 반환합니다.


C 언어

  1. C++ 연산자
  2. C++ 주석
  3. C++ 클래스 템플릿
  4. C 파일 처리
  5. 자바 예외 처리
  6. C++ 예외 처리:시도, 캐치, 던지기 예제
  7. Python 예외 처리:try, catch, finally 및 제기 [예제]
  8. C - 오류 처리
  9. C++ 개요
  10. C++ 상수/리터럴