예외와 오류 처리: 실패를 호출자에게 명확히 전달하는 법
19강. 예외와 오류 처리: 실패를 호출자에게 명확히 전달하는 법
이번 강의에서 해결할 문제
모든 실패를 예외로 던지거나 모든 함수에 정수 오류 코드를 붙이는 한 가지 정답은 없습니다. 입력 오류처럼 예상 가능한 실패와 파일 시스템 장애처럼 깊은 계층에서 전달할 실패는 복구 위치와 프로젝트 규칙이 다릅니다.
학습 목표
먼저 알아야 할 핵심 개념
예외는 일반 반환 경로와 실패 전파를 분리하고 깊은 호출 스택을 건너뛸 수 있습니다. 결과 타입은 가능한 오류를 시그니처에 드러내고 호출자가 분기를 직접 처리하게 합니다. optional은 원인 구분이 필요 없는 정상적인 값 없음에 적합합니다. 어떤 방식을 쓰든 자원은 RAII로 정리되어야 합니다.
왜 이 문제가 위험한가
작업 상태를 완료로 먼저 바꾼 뒤 저장이 실패하면 메모리와 파일 상태가 어긋납니다. 예외를 경계 없이 삼키면 원인을 잃고, 로그만 남기고 성공을 반환하면 호출자가 실패를 복구할 수 없습니다. 실패 원자성, 즉 실패하면 관찰 가능한 상태가 호출 전과 같도록 설계해야 합니다.
가장 작은 예제로 시작하기
#include <iostream>
#include <string>
enum class CompleteError { None, NotFound, AlreadyCompleted };
struct CompleteResult {
bool ok{};
CompleteError error{CompleteError::None};
};
struct Task { int id{}; bool completed{}; };
CompleteResult complete(Task* task) {
if (task == nullptr) return {false, CompleteError::NotFound};
if (task->completed) return {false, CompleteError::AlreadyCompleted};
task->completed = true; // 모든 검증 뒤 commit
return {true, CompleteError::None};
}
int main() {
Task task{7, false};
std::cout << complete(&task).ok << ':' << task.completed << '\n';
std::cout << complete(&task).ok << ':' << task.completed << '\n';
}
코드 한 줄씩 이해하기
- enum class가 오류 종류를 임의 정수와 분리합니다.
- 결과 타입은 성공 여부와 이유를 함께 전달합니다.
- null과 이미 완료 상태를 먼저 검사합니다.
- 실제 상태 변경은 검증이 모두 끝난 뒤 한 줄에서 수행됩니다.
- 두 번째 실패에서도
completed는 true로 유지되고 추가 변경이 없습니다.
실행 결과와 메모리·동작 흐름
bool 출력 기본값 기준으로 1:1, 0:1입니다. 첫 호출만 false에서 true로 전환합니다. 두 번째 호출은 오류를 반환하고 상태를 바꾸지 않습니다. 파일 저장까지 원자적으로 묶으려면 임시 파일과 교체 같은 별도 전략이 필요합니다.
단계별 실습
흔한 실수와 해결 방법
언제 사용하고 언제 피할까
예상 가능한 도메인 분기는 결과 타입, 정상적인 값 없음은 optional, 깊은 계층의 드문 복구 불가 실패는 프로젝트가 허용하면 예외를 고려합니다. 예외를 금지한 환경에서는 동일한 오류 정보를 명시적 타입으로 전달합니다.
게임 개발 연결
명령 거부, 대상 없음, 저장 실패는 복구 위치가 다릅니다. 프레임 루프까지 예외가 탈출하지 않게 프로젝트 경계에서 처리하되 오류 원인을 숨기지 않습니다.
이해 점검 질문 3개
- optional보다 명시적 결과 타입이 나은 오류는 어떤 경우인가요?
- 실패 원자성을 위해 검증과 commit 순서를 어떻게 배치해야 하나요?
- 예외와 오류 반환 선택에 프로젝트 규칙이 중요한 이유는 무엇인가요?
핵심 요약
다음 강의 연결
20강. 템플릿에서 서로 다른 타입에 같은 규칙을 적용하되 과도한 일반화를 피합니다.
예외와 오류 처리: 실패를 호출자에게 명확히 전달하는 법 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.