본문 바로가기
!?/C++

Exception Handling

by Where's my namespace 2012. 9. 10.

예외처리, 아주 중요하다. 프로그램을 만들었는데 비정상 종료가 된다면 어떤 기분인지 잘 알 것이다.

 

후에도 예외처리는 매우 중요하다. 예외 처리의 중요성을 다타낸 글이 또 하나 있다.

 

만약에, 당신이 구매자라면 기능이 다양한다 간혹 꺼지는 프로그램과, 기능은 단순하지만 절때 꺼지지 않는 프로그램이

있다면, 당신은 무엇을 구매 할 것인지 생각해보면, 예외처리가 얼마나 중요한지를 알 수 있다. 

 

개념 자체는 간단하다. 특정 상황에서 예외가 발생했다고 하면, 그 발생한 예외를 처리해주면된다. 그게 예외처리다.

 

예외처리에 사용되는 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