C++ 예외 처리 완벽 가이드 | try-catch, throw, 표준 예외, 접근 위반까지

2025. 6. 23. 17:36Developer Roadmap/C++

반응형

C++ 예외 처리 완벽 가이드 | try-catch, throw, 표준 예외, 접근 위반까지

C++에서 예외 처리는 프로그램 실행 중 발생하는 오류를 효과적으로 처리하고, 비정상 종료를 방지하는 데 중요한 역할을 한다. 이 글에서는 C++의 예외 처리 문법과 표준 예외 클래스, 종료 코드 처리 방식, 그리고 접근 위반 오류까지 상세히 소개한다.


C++ 예외 처리란?

예외 처리는 프로그램 실행 중 예상치 못한 상황에 대응하는 방법이다. 오류가 발생했을 때 프로그램을 중단하지 않고, 해당 상황을 처리한 후 정상 흐름으로 복귀하거나 안전하게 종료할 수 있도록 한다.

예외 처리 키워드

  • try: 예외 발생 가능성이 있는 코드를 감싼다.
  • catch: 예외가 발생했을 때 실행할 코드를 정의한다.
  • throw: 특정 예외를 명시적으로 발생시킨다.
  • noexcept: 함수에서 예외를 던지지 않음을 명시한다.

C++ 예외 처리 기본 문법 예제

int divide(int a, int b) {
    if (b == 0) {
        throw "0으로 나눌 수 없습니다!";
    }
    return a / b;
}

try {
    int result = divide(10, 0);
    std::cout << result;
} catch (const char* msg) {
    std::cerr << msg;
}

이 예제에서는 0으로 나누는 경우 throw로 예외를 발생시키고, catch 블록에서 오류 메시지를 처리한다.


C++ 표준 예외 클래스 사용법

C++ 표준 라이브러리 <stdexcept>에서는 예외 처리를 위한 다양한 클래스들을 제공한다. 이를 통해 더욱 세분화된 오류 처리 로직을 구현할 수 있다.

주요 예외 클래스

  • std::exception: 모든 표준 예외 클래스의 상위 클래스
  • std::logic_error: 코드상의 논리적 오류
  • std::runtime_error: 실행 중 발생하는 일반적인 오류
#include <stdexcept>

int divide(int a, int b) {
    if (b == 0) {
        throw std::runtime_error("0으로 나눌 수 없습니다!");
    }
    return a / b;
}

catch (const std::exception& e) {
    std::cerr << e.what();
}

C++ 종료 코드 (Exit Code)

종료 코드는 프로그램이 종료될 때 반환하는 값으로, 운영체제나 쉘에서 프로그램의 성공 또는 실패 여부를 판단하는 기준이 된다.

  • return 0: 정상 종료
  • return 1, exit(1) 등: 오류 또는 비정상 종료
int main() {
    if (에러조건) return 1;
    return 0;
}

또는

#include <cstdlib>
std::exit(1);

접근 위반 오류(Access Violation)

C++에서 접근 위반은 가장 치명적인 오류 중 하나다. 잘못된 메모리 접근으로 인해 프로그램이 예기치 않게 종료되거나, 메모리 손상으로 이어질 수 있다.

접근 위반의 주요 원인

1. 널 포인터 역참조

int* p = nullptr;
int x = *p;

2. 배열 범위 초과

int arr[5] = {1,2,3,4,5};
int x = arr[5]; // 유효 범위 초과

3. 해제된 메모리 접근

int* p = new int[5];
delete[] p;
p[0] = 10;

메모리 오류 디버깅 도구

  • Valgrind: Linux에서 메모리 접근 오류 및 누수 감지 가능
  • AddressSanitizer: 런타임 중 메모리 오류 탐지
  • Visual Studio 디버거: Windows 환경에서 접근 위반 추적

마무리

C++에서 예외 처리는 단순한 try-catch 구문을 넘어서, 시스템 안정성과 사용자 경험을 책임지는 중요한 요소다. 표준 예외 클래스와 종료 코드 처리 방식, 그리고 접근 위반 방지를 위한 디버깅 도구까지 적극적으로 활용해야 한다.

반응형