<개인공부>/[C++]

[C++] 예외처리 (Exception Handling, try catch)

BlockDMask 2017. 7. 14. 13:17
반응형

1) "예외 상황" 과 "예외 처리" 란.

  • 예외 상황 : 예외(Exception)는 언어상의 문법적인 오류가 아니라 내가 의도한, 구현한 프로그램의 논리에 맞지 않는 상황을 말합니다.

  • 이러한 예외 상황에서, 특별한 처리를 하는 것을 예외처리(Exception Handling)이라 합니다.
  • ex) 나눗셈을 할때 나누는 수 가 0으로 입력되는 경우를 "예외 상황" 이라 하고, 이에 대해 다시 입력을 받거나 프로그램을 종료하는 방법을 정의해주는 것을 "예외 처리"라고 할 수 있습니다.

2) "예외 처리"를 위한 방법.

  • 사실 우리는 조건문(if)를 통해서 이전부터 예외처리를 해왔었습니다. 하지만, C++언어에서 예외 처리를 위해 제공하는 메커니즘이 존재합니다.

  • 조건문(if)를 통해서 예외 처리하는 방법도 좋지만, 이는 예외처리를 위한 코드인지, 프로그램의 논리를 위한 코드인지 구분하기 힘든 단점이 있습니다.

  • C++에서 예외 처리를 위해 제공하는 메커니즘은 try, throw, catch 로 구성되어있습니다.

    try -  try내부에서 예외가 있는지 탐색을 하는 부분입니다.
    throw - try에서 에외를 탐색하면 throw의 인자로 준 변수를 catch로 던집니다.
    catch throw에서 던진 변수를 인자로 받아서 catch 내부에 프로그래머가 정의한 예외처리를 실시합니다.
    **내부라는 표현은 { } 중괄호 안을 말합니다.
    예외가 발생했을때 throw를 통해서 인자로 보내고, catch 부분이 실행이 되고, try내부에서 throw 이후 부분은 skip하게 됩니다.

3) try, throw, catch 를 통한 예외처리 방법 과 예시


예시 1) a/b 문제 (일반적인 경우)


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
#include <iostream>
using namespace std;
int main(void){
    int a, b;
//try에서 예외가 있는지 탐색.
    try{
        cin >> a;
        cin >> b;
 
        if(b<=0){//예외 발생시,
            throw b; //throw를 통해 변수 b를 catch의 파라미터로 보냄.
        }
 
        cout << "[work]" << endl;
        cout << "a : " << a << " , b : " << b << endl;
        cout << "a/b : " << a/<<endl;
 
 
    }catch(int expn){//throw에서 보낸 b를 인자를 expn으로 받는다.
        cout << "[error]" << endl;
        cout << "can't use this : " << expn << endl;
    }
 
 
    cout << "Program End" << endl;
    return 0;    
}
 
cs

14-16 줄은 정상적으로 프로그램이 동작할때 동작을 합니다.
19-21은 예외처리를 통해 throw에서 catch로 던져지면서 실행이 됩니다. 이때, 파랑 부분은 생략하고 넘어가게됩니다.

> 14-16줄 (정상적으로 돌아갔을때)일때 결과 값을 보겠습니다.


> 19-21줄 (예외처리) 결과 값을 보겠습니다.


  • 그림으로 한번 살펴보겠습니다.

    파란부분은 catch부분을 스킵하고
    빨간부분은 throw 아래 부분을 스합니다.


예시2) "swap 함수에서 인자로 들어오는 값이 같을때"를 예외처리 한다고 가정하자 (함수 내부에서 throw를 보내는 경우)


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
32
33
34
35
36
37
38
#include <iostream>
using namespace std;
 
void swap(int &a, int &b){
    int tmp;
 
//호출된 함수 내부에서 예외 처리를 하여 throw를 통해 catch에 보낸다.
    if(a == b) throw a;
    
    tmp = a;
    a = b;
    b = tmp;
}
 
int main(void){
    int num1;
    int num2;
 
    try{
        cin >> num1;
        cin >> num2;
        
        //try 내부에서 swap 함수 호출.
        swap(num1, num2);
        
        cout << "\n[swap 완료]" << endl;
        cout << "num1 : " << num1 << ", num2 : " << num2 << endl;
    
 
    }catch (int expn){ // throw를 통해 변수를 인자값으로 받는다.
        cout << "\n[swap 실패]" << endl;
        cout << "num1, num2 : " << expn << " 으로 동일합니다." << endl
    }
 
    
    cout << "==== Program End ====" <<endl
    return 0;    
}
cs


> 26-27줄 파란부분(정상적으로 돌아갔을때)일때 결과 값을 보겠습니다.


> 30-32줄 빨간부분(예외처리) 결과 값을 보겠습니다.


==> try 내부에서 호출한 함수 내부에서도 예외처리 메커니즘이 작동함을 확인할 수 있었습니다.


반응형