Exceptions

예외 복구 경계

예외 처리는 실패를 숨기지 않고 적절한 호출 계층까지 전달한다. 어떤 실패가 복구 가능하고 어떤 상태가 보존되어야 하는지 먼저 정해야 한다.

01

실패 종류 분류

입력 오류, 리소스 부족, 프로그래머 오류를 같은 방식으로 던지지 않는다.

02

소유권을 RAII에 맡긴다

예외가 중간에 지나가도 지역 객체의 소멸자가 리소스를 정리하게 만든다.

03

복구 지점 선택

catch는 처리할 수 있는 계층에만 두고, 로그만 남기고 삼키는 코드는 피한다.

기본 보장
불변식 유지 예외가 나도 객체는 파괴 가능하고 다시 사용할 수 있는 상태여야 한다.
최소한의 안전선이다.
강한 보장
커밋 전 원상 유지 작업 실패 시 호출 전 상태와 같게 남기는 방식이다.
copy-and-swap이 대표 패턴이다.
no-throw
실패를 밖으로 내지 않음 소멸자, swap, move 같은 함수에서 중요하다.
noexcept는 컨테이너 최적화에도 영향이 있다.
예외 타입
의미 있는 분류 std::runtime_error, out_of_range처럼 호출자가 구분할 수 있는 타입을 고른다.
문자열만으로 정책을 만들지 않는다.

catch 위치 · 상태 보장 · 소멸자 점검

catch 위치 바로 처리할 수 없는 예외를 단지 조용히 삼키고 있지 않은가.
상태 보장 예외가 발생한 뒤 객체가 어떤 상태로 남는지 문서화할 수 있는가.
소멸자 소멸자에서 예외가 새어 나올 가능성이 없는가.

복구 경계

try {
    auto config = load_config(path);
    run(config);
} catch (const ConfigError& e) {
    report_to_user(e.what());
}