방프리

17.11.30. Effective C++ 5. 구현 (항목29) 본문

C++/Effective C++

17.11.30. Effective C++ 5. 구현 (항목29)

방프리 2020. 1. 15. 21:30

항목 29 : 예외 안전성이 확보되는 그날 위해 싸우고 또 싸우자!

 

코딩을 할 때 가장 염두해야할 것 중 하나를 고르자면 예외처리가 빠질 수 없습니다. 

필자도 동물에 비유하면서까지 예외처리의 중요성을 설명할 정도이니깐요. 

예외 안전성을 가진 함수면 예외가 발생시 다음과 같이 동작해야 합니다.

1) 자원이 새도록 만들지 않습니다.

2) 자료구조가 더럽혀지는 것을 허용하지 않습니다.

예외 안전성을 가진 함수는 아래의 세 가지 보장 중 하나를 제공하여 줍니다.

1) 기본적인 보장(basic guarantee) : 함수 동작 중에 예외가 발생하면, 실행 중인 프로그램에 관련된 모든 것들을

유효한 상태로 유지하겠다는 보장입니다. 하지만 사용자측에서는 예측할 수 없습니다.

2) 강력한 보장(string guarantee) : 함수 동작 중에 예외가 발생하면, 프로그램의 상태를 절대적으로 변경하지 않겠다는

보장입니다.

3) 예외불가 보장(nothrow guarantee) : 예외를 절대로 던지지 않겠다는 보장입니다.

약속한 동작은 언제나 끝가지 완수하는 함수라는 뜻입니다.

이 세 가지 보장 중 하나를 상황에 맞추어 염두하고 개발을 진행해야 합니다.

에러처리 디버그는 프로그래밍에 있어서 절대로 빠질 수 없는 것이기 때문이죠

 

* 이것만은 잊지말자

- 예외 안전성을 갖춘 함수는 실행 중 예외가 발생되더라도 자원을 누출시키지 않으며,

자료구조를 더럽힌 채로 내버려 두지 않습니다. 이런 함수들이 제공할 수 있는 예외 안전성 보장은 기본적인 보장,

강력한 보장, 예외 금지 보장이 있습니다.

- 강력한 예외 안전성 보장은 '복사-후-맞바꾸기' 방법을 써서 구현할 수 있지만 모든 함수에 대해 강력한 보장이 

실용적인 것은 아닙니다.

- 어떤 함수가 제공하는 예외 안전성 보장의 강도는, 그 함수가 내부적으로 호출하는 함수들이 제공하는

가장 약한 보장을 넘지 않습니다.

Comments