본문 바로가기

3.구현/VC++

[VC++]Writing Exception-Safe Code with Visual C++

 

 

출처 : http://www.devx.com/premier/mgznarch/vcdj/1997/nov97/vccode1.asp

아래는 제가 읽고 대충 느낀 점을 요약한 내용입니다.

 


================================================================================

#include

void main()
{
  int a = 0 ;
  int b = 5 / a ;
}



만약 이처럼 코딩했다면 아래와 같은 다이얼로그 박스가 뜨겠죠?
(이러한 창을 "Unexpected Application Error" Message Box 라고 합니다..)


이걸 없애려는 것입니다. 자체적으로 런타임 에러를 처리하겠다는 것이지요.
이러한 기능은 OS 에서 지원해주는 Structured Exception Handling 을 이용해 가능한 것입니다.
C++ 의 편리한 예외 처리 기능과 OS 의 에러 확인 기능을 합쳐서 robust 한 application 을 만들자는 취지.. 그것입니닷.

================================================================================

SEH 를 standard C++ exception 으로 redirect 하는 결정적 위치에

_set_se_translator()

함수가 사용되는데요... 이 함수는 함수포인터를 파라미터로 갖는데 파라미터가 될 함수포인터는

void mapSehException(unsigned int nCode, EXCEPTION_POINTERS* p);


이와 같은 형태여야 하는것입니다...

================================================================================

Exception 을 다룰때 한가지 더 걱정되는 것이 있습니다.
바로 memory leak 입니다. 메모리를 할당해 놓고 에러가 발생할 경우 에러로 죽어버리면 해제를 못하기 때문입니다. 요롤때 쓰는게 바로 std::auto_ptr 클래스입니다.
auto_ptr 을 활용할 경우 에러 발생시도 자동으로 삭제되는 포인터를 만들수 있기 때문입니다..
헌데 lifecycle 이 다른 포인터를 사용할 경우 오류가 발생할 수도 있으므로 좀더 정밀한 것은 직접 구현해야 한다고 하네요...

COM 의 스마트 포인터가 괜히 있는게 아니었군요... (스마트라... 정말? -.-)

================================================================================

몇가지 주의 할점은 각각의 Thread 마다 terminate functions 을 설정해 줘야 하며,
try, catch 문을 사용하지 않았다면 어쩔수 없이 UAE 상자를 볼수 밖에 없다는 것입니다... --; 

 

반응형