2025. 6. 23. 17:36ㆍDeveloper 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 구문을 넘어서, 시스템 안정성과 사용자 경험을 책임지는 중요한 요소다. 표준 예외 클래스와 종료 코드 처리 방식, 그리고 접근 위반 방지를 위한 디버깅 도구까지 적극적으로 활용해야 한다.
'Developer Roadmap > C++' 카테고리의 다른 글
C++ STL 완전 정리: 컨테이너, 알고리즘, 반복자 한눈에 보기 (0) | 2025.06.25 |
---|---|
C++ 언어 개념 완전 정리 - 기초부터 핵심까지 한눈에 (0) | 2025.06.24 |
C++ Structures와 Classes로 배우는 객체 지향 프로그래밍 핵심 개념 (0) | 2025.06.20 |
C++ 코드 구조화 제대로 이해하기 - 네임스페이스부터 헤더/소스 분리까지 (0) | 2025.06.19 |
C++ 포인터와 레퍼런스 완전 정리 : 스마트 포인터부터 메모리 누수까지 (0) | 2025.06.18 |