언어 공부/C++

예외 처리2

세희홍 2022. 7. 6. 00:41

1에서 발생한 문제를 해결하는 C++ 예외 처리 방법

 

try-catch 블록

try
{
	예외를 발생시킬 수 있는 코드
}
catch(자료형 변수)
{
	예외를 처리하는 코드
}

try 절에서 오류가 발생하면 예외를 발생시켜서 throw로 던진다. catch 절에서 예외가 발생했을 경우 프로그램이 중단되는 것을 막는 처리를 한다. 

 

1. 함수 내부의 try-catch 블록

try-catch 블록이 모두 하나의 함수 내부에 포함된 경우. 예외가 발생하면 try절의 나머지 코드는 무시되고 catch구문으로 이동. 예오가 발생하지 않는다면 try 절의 남은 부분이 실행되고 catch 절은 무시된다.  거의 사용하지 않음

    try 
    {
      if(num2 == 0)
      {
        throw 0;      // int 자료형의 예외를 발생
      }
      result = num1 /num2;
      cout << "결과 = " << result << endl;
    }
    catch(int x)
    {
      cout << "0으로 나눌 수 없습니다." << endl;
    }

 

2. 호출되는 함수 쪽에서 throw 하는 경우

연산처리와 관련된 내용은 호출되는 함수 쪽에, 문제가 있는 경우 문제를 호출한 함수쪽에서 처리. 예외가 발생한 입력만 무시하고 코드가 계속 실행된다. 

int quotient(int first, int second); // 함수 선언

int main()
{
  int num1, num2, result;
  for(int i = 0; i < 3; i++)
  {
    cout << "정수를 입력하세요: ";
    cin >> num1;
    cout << "또 다른 정수를 입력하세요: ";
    cin >> num2;
    // try-catch 블록
    try 
    {
      cout << "결과 = " << quotient(num1, num2) << endl;
    }
    catch(int ex)
    {
      cout << "0으로 나눌 수 없습니다." << endl;
    }
  }  
  return 0;
}
// 함수 정의
int quotient(int first, int second)
{
  if(second == 0)
  {
    throw 0;
  }
  return first / second;
}

 

3. 호출하는 함수와 호출되는 함수 모두에 try-catch 블록이 있는 경우 

호출되는 함수 쪽에서 처리를 중단하고, 호출한 함수 쪽으로 예외를 전달하는 경우. 프로그램 끊김없이 예외를 처리할 수 있다. 

 

#include <iostream>
using namespace std;

int quotient(int first, int second); // 함수 선언

int main()
{
    int num1, num2, result;
    for (int i = 0; i < 3; i++)
    {
        cout << "정수를 입력하세요: ";
        cin >> num1;
        cout << "또 다른 정수를 입력하세요: ";
        cin >> num2;
        try
        {
            cout << "결과 = " << quotient(num1, num2) << endl;
        }
        catch (int ex)
        {
            cout << "0으로 나눌 수 없습니다." << endl;
        }
    }
    return 0;
}

int quotient(int first, int second)
{
    try
    {
        if (second == 0)
        {
            throw 0;
        }
    }
    catch (int ex)
    {
        cout << "0으로 나눌 수 없습니다." << endl;
        throw;  // rethrow
    }
    return first / second;
}

        catch (int ex)
        {
            cout << "0으로 나눌 수 없습니다." << endl;
        }
        catch (char ex)
        {
            cout << "0으로 나눌 수 없습니다. 아스키값 전달" << endl;
        }
        catch (...)
        {
            cout << "0으로 나눌 수 없습니다. 정수 및 문자가 아닌 경우" << endl;
        }

점 3개를 입력하면 모든 자료형의 예외를 처리한다.