본문으로 건너뛰기
모던 C++ 심화LESSON 19

예외와 오류 처리: 실패를 호출자에게 명확히 전달하는 법

난이도중급 → 심화
예상 시간70분
선수지식이전 강의

19강. 예외와 오류 처리: 실패를 호출자에게 명확히 전달하는 법

이번 강의에서 해결할 문제​

모든 실패를 예외로 던지거나 모든 함수에 정수 오류 코드를 붙이는 한 가지 정답은 없습니다. 입력 오류처럼 예상 가능한 실패와 파일 시스템 장애처럼 깊은 계층에서 전달할 실패는 복구 위치와 프로젝트 규칙이 다릅니다.

학습 목표​

먼저 알아야 할 핵심 개념​

예외는 일반 반환 경로와 실패 전파를 분리하고 깊은 호출 스택을 건너뛸 수 있습니다. 결과 타입은 가능한 오류를 시그니처에 드러내고 호출자가 분기를 직접 처리하게 합니다. optional은 원인 구분이 필요 없는 정상적인 값 없음에 적합합니다. 어떤 방식을 쓰든 자원은 RAII로 정리되어야 합니다.

왜 이 문제가 위험한가​

작업 상태를 완료로 먼저 바꾼 뒤 저장이 실패하면 메모리와 파일 상태가 어긋납니다. 예외를 경계 없이 삼키면 원인을 잃고, 로그만 남기고 성공을 반환하면 호출자가 실패를 복구할 수 없습니다. 실패 원자성, 즉 실패하면 관찰 가능한 상태가 호출 전과 같도록 설계해야 합니다.

가장 작은 예제로 시작하기​

task_result.cpp
#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';
}

코드 한 줄씩 이해하기​

  1. enum class가 오류 종류를 임의 정수와 분리합니다.
  2. 결과 타입은 성공 여부와 이유를 함께 전달합니다.
  3. null과 이미 완료 상태를 먼저 검사합니다.
  4. 실제 상태 변경은 검증이 모두 끝난 뒤 한 줄에서 수행됩니다.
  5. 두 번째 실패에서도 completed는 true로 유지되고 추가 변경이 없습니다.

실행 결과와 메모리·동작 흐름​

bool 출력 기본값 기준으로 1:1, 0:1입니다. 첫 호출만 false에서 true로 전환합니다. 두 번째 호출은 오류를 반환하고 상태를 바꾸지 않습니다. 파일 저장까지 원자적으로 묶으려면 임시 파일과 교체 같은 별도 전략이 필요합니다.

단계별 실습​

흔한 실수와 해결 방법​

언제 사용하고 언제 피할까​

예상 가능한 도메인 분기는 결과 타입, 정상적인 값 없음은 optional, 깊은 계층의 드문 복구 불가 실패는 프로젝트가 허용하면 예외를 고려합니다. 예외를 금지한 환경에서는 동일한 오류 정보를 명시적 타입으로 전달합니다.

게임 개발 연결​

명령 거부, 대상 없음, 저장 실패는 복구 위치가 다릅니다. 프레임 루프까지 예외가 탈출하지 않게 프로젝트 경계에서 처리하되 오류 원인을 숨기지 않습니다.

이해 점검 질문 3개​

  1. optional보다 명시적 결과 타입이 나은 오류는 어떤 경우인가요?
  2. 실패 원자성을 위해 검증과 commit 순서를 어떻게 배치해야 하나요?
  3. 예외와 오류 반환 선택에 프로젝트 규칙이 중요한 이유는 무엇인가요?

핵심 요약​

다음 강의 연결​

20강. 템플릿에서 서로 다른 타입에 같은 규칙을 적용하되 과도한 일반화를 피합니다.

MINI QUIZ

예외와 오류 처리: 실패를 호출자에게 명확히 전달하는 법 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“예외와 오류 처리: 실패를 호출자에게 명확히 전달하는 법” 작업 전 검토에서 채택해야 할 안전 기준은 무엇인가요?
  2. 문제 2‘예외 또는 오류 코드 하나만 정답으로 사용’ 상태에 관한 “예외와 오류 처리: 실패를 호출자에게 명확히 전달하는 법” 본문의 설명으로 가장 알맞은 것은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

19강. 예외와 오류 처리: 실패를 호출자에게 명확히 전달하는 법 미완료 상태