예외처리, 아주 중요하다. 프로그램을 만들었는데 비정상 종료가 된다면 어떤 기분인지 잘 알 것이다.
후에도 예외처리는 매우 중요하다. 예외 처리의 중요성을 다타낸 글이 또 하나 있다.
만약에, 당신이 구매자라면 기능이 다양한다 간혹 꺼지는 프로그램과, 기능은 단순하지만 절때 꺼지지 않는 프로그램이
있다면, 당신은 무엇을 구매 할 것인지 생각해보면, 예외처리가 얼마나 중요한지를 알 수 있다.
개념 자체는 간단하다. 특정 상황에서 예외가 발생했다고 하면, 그 발생한 예외를 처리해주면된다. 그게 예외처리다.
예외처리에 사용되는 3가지 명령어를 먼저 살펴보자.
throw : 예외를 던지는 명령을 수행한다.
try : 던져진 예외의 범위를 가지고있다.
catch : try 에서 던진 예외를 가지고 작업을 수행한다.
위의 3가지가 예외처리에 쓰이는 명령어다. 사용한 예를 먼저 보자.
#include <iostream>
using namespace std;
void A() { B(); }
void B() { C(); }
void C() { throw 333; }
int main() {
try {
A();
}
catch( int ex ) {
cout << "error : " << ex << endl;
}
return 0;
}
매우 간단한 코드가 완성됐다. 위의 코드들은 간단하지만 많은 예를 보여준다. 우선 예외처리의 경우 위의 함수들 처럼
여러 함수들을 실행-실행-예외 순으로 있어도 아무 문제 없이 예외처리가 된다는점이다. 단 주의할 것은, 예외처리가
발생하면, 그 순간 프로그램은 오류를 나타내고 종료되므로, 동적메모리 해제 같은 경우에는 신경을 써서 해야한다.
위의 예를 좀더 설명하자면, try 로 범위는 A() 함수의 실행을 잡았다. 만약에 배열의 인덱스 초과 같은 경우에는 그냥
값의 초과로 나타내어도 된다. 예를 들자면,
void GetArr(int size, int* arr) {
if( size >= 8 ) throw "OverSize!!";
else return arr[i];
}
int main() {
int arr[8] = {0};
GetArr(8, arr);
try {
GetArr(8,arr);
}
catch(char* ex) {
cout << "error : " << ex << endl;
}
return 0;
}
과 같은 경우를 보자. 이 경우에 위에서 말한 try 에 다른 걸 써도 된다고 보여줄려다가 너무 산으로 와 버렸는데,
이런 경우에도 예외처리가 가능하다, 여기서 눈여겨 볼점은 throw 에서 던지는건 어떤 타입이든 상관없다.
객체도 던질수 있다. 다만 그것을 받아줄 catch가 있어야한다. catch 는 몇개가 되던지 상관없다.
다시 개념을 정리하자면 예외는 3가지의 작업으로 구성된다. 예외를 찾아서 던지는(throw ) 와, 던져진
예외를 받아서 어떤 범위의 예외인지 보고 catch 로 넘겨주는(try), try에서 받은 예외를 최종 작업을 하는
catch. 이 셋만 알아도 기본적인 개념은 아는 것이다.
'!? > C++' 카테고리의 다른 글
연산자 오버로딩 (0) | 2012.10.12 |
---|---|
접근 범위, 존속 기간 (0) | 2012.09.14 |
오버라이딩 (0) | 2012.08.30 |
클래스 가상함수 (1) | 2012.08.30 |
클래스 상속과 포함. (0) | 2012.08.28 |