Item 8: 예외가 소멸자를 떠나지 못하도록 붙들여 놓자

소멸자로부터 예외가 터져 나가는 경우를 C++ 언어에서 막는 것을 아니지만, 실제 상황을 들춰보면 확실히 우리가 막을 수밖에 없는 것 같다.

만약 소멸자에서 예외가 발생한다면 이것을 예외가 발생했다. 즉, 예외를 전파한다고 봐야한다. 쉽게 말해서 그 소멸자에서 예외가 나가도록 내버려 둔다는 것이다. 바로 이것이 문제다. 예외를 던지는 소멸자는 곧 ‘걱정거리’를 의미한다.

방법으로 두가지가 있다.

  • 예외가 발생하면 프로그램을 바로 종료시키는 것
    • 소멸자에서 생긴 예외를 흘려 내보냈다가 정의되지 않은 동작에까지 이를 수 있다.
  • 예외를 호출시킨 곳에서 예외를 삼켜버리는 것
    • 예외를 삼켜버리는 것은 좋은 선택은 아니다. 하지만 때에 따라 불완전한 프로그램 종료 혹은 미정의 동작으로 인해 위험을 감수한느 것보다 그냥 예외를 먹어버리는 게 나을 수 있다.

이 내용은 예외에 대해서 이야기하는 것이 아닌 예외를 일으키는 소멸자에 대한 이야기로 위 방법도 정답은 아니지만, 예외가 발생하는 소멸자는 매우 큰 위험을 안고 있다.

정리

  • 소멸자에서는 예외가 빠져나가면 안 된다. 만약 소멸자 안에서 호출된 함수가 예외를 던질 가능성이 있다면, 어떤 예외이든지 소멸자에서 모두 받아낸 후에 삼켜 버리든지 프로그램을 끝내던지 해야한다.
  • 어떤 클래스의 연산이 진행되다가 던진 예외에 대해 사용자가 반응해야 할 필요가 있다면, 해당 연산을 제공하는 함수는 반드시 보통의 함수이어야 한다.

태그: ,

카테고리:

업데이트:

댓글남기기