소멸자에서 예외를 던지는 경우, 프로그램이 정의되지 않은 동작을 보일수 있다. 소멸자에서 예외가 생기는 경우 핸들링 해줄 주체가 모호 해지므로, 소멸자 안에서 예외를 삼키던지 프로그램이 종료되어야한다. -->사실 왜 소멸자에 대해서만 말하는 지 잘 모르겠습니다;;
1. 프로그램을 바로 끝내는 경우 --> abort호출
DBConn : : -DBConn ()
{
try {
db . close() ;
}
catch ( ... ) {
close 호출이 실패했다는 로그를 작성;
std: : abort();
}
}
2. 예외를 삼켜버리는 경우
DBConn : : -DBConn ()
{
try {
db . close() ;
}
catch ( ... ) {
close 호출이 실패했다는 로그를 작성;
}
}
하지만 둘다 문제가 있다. close가 최초로 예외를 던지게 된 요인에 대해 프로그램이 어떤 조치도 취할 수 없기 때문이다.
따라서 다음과 같은 전략을 취한다.
DBConn의 인터페이스에 close를 제공해 사용자가 직접 예외를 처리할 숭 있도록 하는 것이다. 사용자가 처리했는지를 저장했다가, 처리하지 않은 경우에만 소멸자에서 처리해준다.
--> 어떤 클래스의 연산이 예외를 던진다면 그 연산은 반드시 소멸자가 아닌 보통 함수가 제공하는 것이어야 한다.