예외 안전성 보장(exception-safety guarantee)
0. 개요
예외 안전성 보장은 함수에서 예외가 발생하였을 때 다음과 같은 조건을 충족한다면 예외 안전성을 보장한다고 볼 수 있습니다.
ㆍ 자원이 누수되지 않습니다.
ㆍ 자료구조가 더렵혀지지 않습니다.
또한, 키워드나 함수의 타입과 같이 지정하는 것이 아니므로, 함수를 사용하는 사용자 입장에서는 예외 안전성이 보장되었는지 알 수 없습니다.
1. 종류
예외 안전성을 갖춘 함수는 세 가지 보장 중 하나를 제공합니다.
1) 예외불가 보장(nothrow guarantee)
예외가 발생하지 않습니다. 기본 제공 타입의 모든 연산은 예외를 던지지 않습니다.
2) 강력한 보장(strong guarantee)
예외가 발생하면 예외발생 이전의 상태로 되돌립니다.
성공/실패(예외 X / 예외 발생) 두가지 상태로 나뉘기 때문에 객체의 상태는 동작 이전의 상태 혹은 이후의 상태가 됩니다.
해당 객체는 계속 사용이 가능합니다.
3) 기본 보장(basic guarantee)
프로그램에 관련된 기본적인 것(메모리 누수와 같은)들은 유효한 상태로 유지합니다.
하지만 객체나 프로그램의 상태가 어떤지는 사용자 입장에서는 알 수 없습니다.
때문에, 해당 객체는 계속 사용할 수 없습니다.
2. 정리
예외불가 보장은 기본 제공 타입의 연산에만 적용되므로 적용할 수 있는 경우가 한정적입니다.
가능하다면, 강력한 보장을 염두하며 코딩을 해야 하지만 부수 효과(side effect)와 같은 문제로 강력한 보장을 할 수 없거나 실용적이지 못한 경우가 있습니다.
때문에, 모든 함수에는 강력한 보장을 할 순 없지만, 최대한 염두하는 것이 좋으며 강력한 보장을 할 수 없을 때 최소한의 보장인 기본 보장을 하는 것이 좋습니다.
참고 : effective c++