안녕하세요. moltak 입니다. 이번에 진행할 내용은 사용자 정의 Exception 입니다. 

이번 칼럼은 (1) exception 만들기 (2) stl exception 사용하기 (3) stl exception 확장하기 순서로 진행하겠습니다.

C++을 사용할 때 예외처리를 하기 위해 try/catch를 사용하시죠? C에서는 if를 사용하겠죠.
자 일단 STL exception 을 한번 보시죠.


STL exception은 exception 클래스를 상속받아 사용됩니다. 가장 많이 사용하는 exception으로 bad_alloc이 있죠. 
exception 은 좋긴 하지만 정확한 정보를 얻기에는 조금 힘이들죠. exception을 사용하는 방법은 다음에 보도록 하고 여기서는 자신만의 exception class를 만들어 exception 이 발생했을 때 더 많은 정보를 얻도록 해보조.

일단은 자신만의 클래스를 하나 만드는 것이 좋겠죠? 저는 KException 으로 지었습니다. 그리고 아래와 같이 만들었죠.


하지만 우리는 많은 정보를 넣어야하죠. 제가 넣고 싶은 정보는 [Exception Message], [Exception Function], [Exception Line]입니다. 그것들을 받을 수 있게 다시 작성하였습니다.

위에 코드를 잠깐 설명하자면 생성자에서 [exception 종류], [exception 함수], [exception 라인]을 받아서 단순히 저장하는 역할 을 하고 있습니다. 그리고 이것들을 저장시킬 수 있는 멤버 변수들을 선언했고 m_Message에 exception 내용들을 저장해서 what() 함수에서 리턴해 주는 역할 을 하고 있습니다. 일단 예외를 발생 시켜 보죠.


위와 같이 하면 ex.what() 함수가 실행되면서 사용자 정의 메시지와, 에러가 난 함수, 그리고 라인을 볼 수있습니다.
__FUNCTION__ 과 __LINE__ 은 각각 함수와 라인을 보여 주는 매크로입니다.

근데 현재 KException는 아직 조금 부족합니다. 사용자가 what의 출력을 다르게 해주고 싶다거나 다른 변수를 넣고 싶은 경우가 있을 수 있는데 KException은 확장이 조금 어렵죠. STL Exception 을 보면 exception 클래스를 상속받아 여러가지 다른  exception 들이 존재한다는 것을 알 수 있습니다. 우리도 그렇게 만들어 보죠.

KException_File 클래스를 만들었습니다. KException_File클래스는 KException 클래스를 상속받아 구현되며 KException은 
virtual const char* what() = 0; 클래스를 만들어 추상 클래스로 만들었습니다. 이제 KException은 인스턴스화 되지 못하고 다만 자식 클래스의 인스턴스를 사용할 때만 사용됩니다. 

위와 같이 클래스 멤버 함수를 정의했습니다. 이제 어느 정도의 확장성은 가질 수 있게 되었네요. 아직 한참 더 만들어야 하지만.ㅋㅋ exception 이 발생했을 때는 아래와 같은 방법으로 받으면 되죠.

이와 같은 방법으로 자신만의 exception을 만들어서 사용 할 수있습니다. design pattern을 넣어서 조금 더 멋지게 만들면 나중에 사용하기 좋겠네요. 지금은 이쯤에서 마치도록 하겠습니다. 그럼 즐프하세요.

'Programming > 이것저것' 카테고리의 다른 글

enum 문자열  (0) 2010.04.09
ASCII Table  (0) 2010.04.05
Handshking  (0) 2010.03.19
Sliding Window  (0) 2010.03.19
CISC & RISC  (0) 2010.03.18

+ Recent posts