C++ try-catch

catch 설계 기준

try-catch는 실패를 숨기는 블록이 아니라 복구 경계를 표시하는 문법이다. 파생 예외부터 잡고, 값 복사 대신 참조로 받고, 재던지기와 로그 위치를 구분한다.

01

범위 축소

실패 가능한 호출만 try에 넣어 어떤 작업이 실패했는지 흐리지 않는다.

큰 try 경계 점검
02

타입 매칭

catch는 위에서 아래로 검사되므로 파생 타입을 먼저 둔다.

std::exception은 뒤
03

참조 수신

catch (const E&)로 받아 복사와 slicing을 피한다.

다형 예외 보존
04

복구/전파

처리할 수 있으면 복구하고, 아니면 문맥을 추가하거나 원본을 재던진다.

throw; 사용
catch (...)
최후 방어 원인을 모르는 모든 예외를 잡으므로 로그 후 종료 같은 경계에 제한한다.
남용 금지
throw;
현재 예외 재던지기 catch 안에서 원본 타입과 stack 맥락을 유지한다.
throw e;와 다름
nested
문맥 추가 throw_with_nested로 낮은 수준 원인을 유지하며 높은 수준 설명을 붙일 수 있다.
진단 개선
범위
정리 코드는 RAII catch마다 close/unlock을 반복하기보다 소멸자로 정리한다.
중복 제거

순서 · 삼키기 · 로그 중복 점검

순서 base exception catch가 파생 exception catch보다 앞에 있지 않은지 확인한다.
삼키기 catch 후 아무 조치 없이 계속 실행해 오류를 감추지 않는지 본다.
로그 중복 여러 층에서 같은 예외를 반복 로그해 노이즈를 만들지 않는지 검토한다.