반응형
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/b <<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줄 (예외처리) 결과 값을 보겠습니다.
> 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줄 파란부분(정상적으로 돌아갔을때)일때 결과 값을 보겠습니다.
==> try 내부에서 호출한 함수 내부에서도 예외처리 메커니즘이 작동함을 확인할 수 있었습니다.
반응형
'<개인공부> > [C++]' 카테고리의 다른 글
[C++] deque container 정리 및 사용법 (2) | 2017.07.23 |
---|---|
[C++] vector container 정리 및 사용법 (41) | 2017.07.20 |
[C++] STL 이란. (0) | 2017.07.19 |
[C++] Pair 클래스 정리 및 예제 (vector, sort) (3) | 2017.07.18 |
[C++] template(템플릿)에 관하여 2 (클래스 템플릿, 템플릿 특수화) (0) | 2017.07.12 |
[C++] template(템플릿) 에 관하여 1 (템플릿이란, 함수 템플릿) (20) | 2017.07.11 |
[C++] string 클래스 변환(atoi, c_str()) 등 정리 (5) | 2017.07.11 |
[C++] string 클래스 정리 (0) | 2017.07.10 |