Minwoo Dev.

[C++] 예외처리 try, catch, throw 본문

C++

[C++] 예외처리 try, catch, throw

itisminu 2024. 7. 24. 16:07
728x90
반응형
SMALL

C++에서도 예외 처리에 try, catch, throw를 사용한다.

 

 

try

  • 예외가 발생할 거 같은 지역을 try 속에 넣는다.
  • 예외가 발생한다면, 그 지점 아래의 코드는 실행되지 않는다.
try{
// 예외 발생 예상지역
}

 

 

catch

  • try 블록에서 발생한 예외(throw로 던져진 예외)를 여기서 catch한다.
  • 발생한 에외를 처리하는 부분이다. (에러 출력과 같은 작업)
  • 예외가 발생하지 않는다면 실행되지 않는다.
catch{
// 예외 처리 코드
}

 

 

throw

  • 예외가 발생했을 때 throw를 보통 던지도록 설계한다.
  • throw를 던지면 catch가 있는 부분까지 빠져나간다.
  • 예외가 발생하면 throw 아래의 코드는 실행되지 않는다.
throw 값;

 

 

예제 코드를 통해 살펴보자.

#include<iostream>
using namespace std;

int main(void){
    int num1, num2;
    cout << "두 개의 숫자 입력 : ";
    cin >> num1 >> num2;

    try{
        if(num2==0)
            throw num2;
        cout << "나눗셈의 몫 : " << num1 / num2 << endl;
        cout << "나눗셈의 나머지 : " << num1 % num2 << endl;
    }
    catch(int expn){
        cout << "계수는 " << expn << "이 될 수 없습니다." << endl;
        cout << "프로그램을 다시 실행하세요." << endl;
    }
    cout << "end of main" << endl;
    return 0;
}

 

위 코드는 두 숫자의 나눗셈을 하는 과정에서, 나누는 수가 0일 경우에 에러가 발생한다.

num2==0인 경우에 num2를 throw하여 바깥의 catch에서 받는다.

catch에서는 num2의 값이 expn에 저장되어 출력된다.

 

실행 결과

 

 

+) 만약 throw한 값을 여러 개의 catch에 맞게 받고싶다면, catch 의 매개변수 타입을 다르게하여 알맞는 catch에 가도록 할 수 있다.

#include<iostream>
using namespace std;

int main(void){
    int num1, num2;
    cout << "두 개의 숫자 입력 : ";
    cin >> num1 >> num2;

    try{
        if(num2==0)
            throw num2;
        cout << "나눗셈의 몫 : " << num1 / num2 << endl;
        cout << "나눗셈의 나머지 : " << num1 % num2 << endl;
    }catch(double expn){ // throw한 값의 타입이 double이라면 여기서 catch
        cout << "catch(double expn)" << endl;
        cout << "계수는 " << expn << "이 될 수 없습니다." << endl;
        cout << "프로그램을 다시 실행하세요." << endl;
    }
    catch(int expn){ // throw한 값의 타입이 int라면 여기서 catch
        cout << "catch(int expn)" << endl;
        cout << "계수는 " << expn << "이 될 수 없습니다." << endl;
        cout << "프로그램을 다시 실행하세요." << endl;
    }
    cout << "end of main" << endl;
    return 0;
}

 

실행 결과

 

 

throw된 값이 int이므로 catch(int expn)에서 catch한 것을 확인할 수 있다.

 

 

 

 

throw된 값을 catch하지 않으면 계속해서 바깥으로 catch를 찾아나간다.

#include<iostream>
using namespace std;

void SimpleFuncOne(void);
void SimpleFuncTwo(void);
void SimpleFuncThree(void);

int main(void){
    try{
        SimpleFuncOne();
    }
    catch(int expn){
        cout << "예외 코드 : " << expn << endl;
    }
    return 0;
}

void SimpleFuncOne(void){
    cout << "SimpleFuncOne(void)" << endl;
    SimpleFuncTwo();
}

void SimpleFuncTwo(void){
    cout << "SimpleFuncTwo(void)" << endl;
    SimpleFuncThree();
}

void SimpleFuncThree(void){
    cout << "SimpleFuncThree(void)" << endl;
    throw -1;
}

 

실행 결과

 

위 코드에서는 SimpleFuncThree에서 에러를 throw하여 catch를 찾아 역순으로 SimpleFuncThree -> SimpleFuncTwo -> SimpleFuncOne -> main으로 이동하여 main의 catch에서 에러를 처리한 것을 보인다.

 

이렇듯 throw된 값을 처리하지 못하면 계속해서 catch를 찾을때까지 이동하게 된다.

 

 

 

728x90
반응형
LIST