Notice
Recent Posts
Recent Comments
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

SYDev

C++ Chapter 15-2 : C++의 예외처리 메커니즘 본문

Programming Lang/C++

C++ Chapter 15-2 : C++의 예외처리 메커니즘

시데브 2023. 8. 1. 14:40

try, catch, throw의 이해

 예외처리 메커니즘과 관련한 키워드는 다음 세 가지이다.

  • try
  • catch
  • throw

 

try 블록

 try 블록은 예외발생에 대한 검사의 범위를 지정

try
{
	//예외발생 예상지역
}

 

catch 블록

 catch 블록은 try 블록에서 발생한 예외를 처리하는 코드가 담기는 영역

catch(처리할 예외의 종류 명시)
{
	//예외처리 코드의 삽입
}

 

try 블록과 catch 블록

catch 블록은 try 블록의 뒤에 이어서 등장, try와 catch는 하나의 문장이기 때문에 반드시 이어서 등장해야 한다. 중간에 다른 문장이 삽입되면 compile error!

 

try
{
    //예외발생 예상지역
}
cout<<"Simple Message"<<endl;   //compile error!
catch(처리할 예외의 종류 명시)
{
    //예외처리 코드의 삽입
}

 

throw

 키워드 throw는 예외가 발생했음을 알리는 문장의 구성에 사용된다.

throw expn;	//expn은 예외상황에 대한 정보를 담은, 의미 있는 데이터. (변수, 상수 그리고 객체 등 표현 가능한 모든 데이터가 될 수 있음)

 

예외처리 메커니즘의 적용

 지난 chpater에서 나왔던 예제에 C++ 예외처리 문법을 적용해보자.

#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)	//throw절에 의해 던져진 예외 데이터 자료형과 catch 블록의 매개변수 자료형은 일치해야 함
    {
        cout<<"제수는 "<<expn<<"이 될 수 없습니다."<<endl;
        cout<<"프로그램을 다시 실행하세요."<<endl;
    }
    cout<<"end of main"<<endl;

    return 0;
}

 예외가 발생하지 않는 경우 -> catch 블록을 건너뛰어 실행

두 개의 숫자 입력: 9
2
나눗셈의 몫: 4
나눗셈의 나머지: 1
end of main

 예외가 발생한 경우 -> 예외가 발생한 지점 이후의 나머지 try 영역을 건너뛰어 실행

두 개의 숫자 입력: 7
0
제수는 0이 될 수 없습니다.
프로그램을 다시 실행하세요.
end of main

 

try 블록을 묶는 기준

 try 블록은 예외가 발생할만한 영역만 묶는 게 아니라, 그와 관련된 모든 문장을 함께 묶어서 하나의 '일(work)'의 단위로 구성해야 한다.

 

 try블록이 예제와 달리 다음과 같이 묶인 경우를 생각해보자.

try
{
    if (num2 == 0)
        throw num2;
}
catch (int expn) { . . . . }

cout << "나눗셈의 몫: " << num1 / num2 << endl;
cout << "나눗셈의 나머지: " << num1 % num2 << endl;

 이 경우 발생한 예외를 인지하고, 이를 처리했음에도 실행되어서는 안 될 문장들이 실행된다.

 


참고자료

  • 윤성우, <윤성우의 열혈 C++ 프로그래밍>, 오렌지미디어, 2010.05.12