throw

예외 실패 의미·객체 상태

throw는 단순한 탈출문이 아니다. 호출자가 이해할 수 있는 타입, 메시지, 보존된 상태가 함께 있어야 예외가 복구 가능한 정보가 된다.

01

계약 위반을 감지한다

인자 범위, 파일 포맷, 상태 전이 조건이 맞지 않을 때 정상 반환으로 숨기지 않는다.

02

타입으로 분류한다

호출자가 다르게 처리해야 하는 실패라면 예외 타입도 다르게 둔다.

03

던지기 전에 정리한다

지역 자원은 RAII에 맡기고, 멤버 상태는 커밋 전 임시 객체에 모아 둔다.

throw object
값으로 던짐 예외 객체는 복사 또는 이동되어 저장되고 catch에서 참조로 받는다.
지역 포인터를 던지지 않는다.
what()
사람이 읽는 맥락 파일명, 키, 범위처럼 원인 추적에 필요한 정보를 담는다.
정책 판단은 타입으로 한다.
exception safety
상태 보존 던진 뒤 호출자가 객체를 버리지 않아도 되는지 보장 수준을 정한다.
부분 변경은 위험하다.
noexcept
던지면 종료 noexcept 함수에서 예외가 빠져나가면 std::terminate가 호출된다.
선언 전에 내부 호출을 확인한다.

타입 · 메시지 · noexcept 점검

타입 모든 실패를 runtime_error 하나로 던져 호출자가 구분하지 못하게 하지 않는가.
메시지 로그 없이도 어떤 입력이나 위치에서 실패했는지 알 수 있는가.
noexcept 던질 수 있는 함수가 실수로 noexcept 경로 안에 들어가 있지 않은가.

맥락 있는 throw

if (index >= values.size()) {
    throw std::out_of_range("index outside values range");
}
return values[index];