C++ throw 설계

throw 계약 신호

예외를 던지는 코드는 실패했다는 사실뿐 아니라 어떤 계약을 만족하지 못했는지를 드러내야 한다. 타입, 메시지, noexcept 경계, strong guarantee를 함께 설계한다.

01

실패 분류

입력 오류, 상태 오류, 시스템 오류, 논리 버그 중 어느 계층인지 나눈다.

타입 선택
02

정보 첨부

경로, 인덱스, 요청 ID처럼 원인을 추적할 최소 문맥을 메시지에 넣는다.

민감정보 제외
03

상태 보존

던지기 전후 객체가 basic 또는 strong guarantee를 지키는지 확인한다.

부분 변경 한계
04

경계 통과

스레드 함수, C API callback, noexcept 함수 밖으로 예외가 새지 않게 잡아 변환한다.

terminate 방지
invalid_argument
호출자가 준 인자 문제 값 범위나 형식이 함수 전제 조건을 만족하지 못한다.
입력 검증
runtime_error
실행 환경 문제 파일, 네트워크, 외부 상태 때문에 요청을 수행하지 못한다.
복구 가능성
logic_error
프로그램 버그 신호 도달하면 안 되는 상태나 불변식 위반을 드러낸다.
테스트 강화
system_error
errno/error_code 연계 운영체제 오류 코드와 메시지를 함께 전달해 원인을 보존한다.
원인 보존

noexcept · 민감정보 · 테스트 점검

noexcept noexcept 함수에서 throw 가능 호출을 감싸거나 명세를 바꿔야 하는지 본다.
민감정보 예외 메시지에 키, 토큰, 개인정보가 섞이지 않았는지 확인한다.
테스트 예외 타입뿐 아니라 실패 후 객체 상태도 검증한다.