throw 이후에는 실행 위치가 catch로 바뀐다

throw는 return처럼 현재 흐름을 끝냅니다. 예외 객체는 복사 비용과 타입 손실을 줄이기 위해 보통 const 참조로 받습니다.

throw 아래 줄은 건너뜀

try {
  throw std::runtime_error("fail");
  saveResult();   // 실행되지 않음
}
남은 try 코드 skip

catch는 참조로 받음

catch (const std::exception& e) {
  log(e.what());
}
복사 없이 타입 보존
try

실패 가능성이 있는 좁은 범위만 감쌉니다.

throw

호출자가 의미를 알 수 있는 타입을 던집니다.

catch

복구 가능한 곳에서 구체적인 타입부터 처리합니다.

핵심: 예외 처리는 “어디서 실패했는가”보다 “어디서 복구할 수 있는가”를 코드 구조로 드러냅니다.