cpp

C++ 예외 처리 (Exception Handling)

임베디드 친구 2024. 12. 20. 20:11
반응형

C++에서 예외 처리는 프로그램 실행 중 발생할 수 있는 오류를 효과적으로 처리하고, 프로그램의 비정상 종료를 방지하기 위한 중요한 기능입니다. 이번 포스팅에서는 C++의 예외 처리에 대해 자세히 살펴보고, 기본 문법과 함께 실용적인 예제를 소개하겠습니다.


예외 처리란?

예외 처리(Exception Handling)란 프로그램 실행 중에 발생하는 예외 상황을 포착하여 적절히 처리함으로써, 프로그램의 비정상 종료를 방지하고 오류 상황을 제어하는 기법입니다. C++에서는 예외 처리를 위해 try, catch, throw 키워드를 사용합니다.

예외 처리의 기본 구조

try {
    // 예외가 발생할 가능성이 있는 코드
} catch (예외_타입 변수명) {
    // 예외를 처리하는 코드
}
  • try 블록: 예외가 발생할 가능성이 있는 코드를 작성합니다.
  • throw: 예외 상황에서 예외 객체를 던집니다.
  • catch: 던져진 예외 객체를 받아서 처리합니다.

예제 1: 기본 예외 처리

간단한 예제를 통해 예외 처리의 기본 동작을 살펴보겠습니다.

#include <iostream>
using namespace std;

int main() {
    try {
        cout << "숫자를 입력하세요: ";
        int x;
        cin >> x;

        if (x == 0) {
            throw "0으로 나눌 수 없습니다.";
        }

        cout << "결과: " << 100 / x << endl;
    } catch (const char* e) {
        cout << "예외 발생: " << e << endl;
    }

    return 0;
}

출력 예시

입력 값에 따라 결과는 다음과 같습니다:

  1. 입력: 10
    • 출력: 결과: 10
  2. 입력: 0
    • 출력: 예외 발생: 0으로 나눌 수 없습니다.

예제 2: 사용자 정의 예외

C++에서는 기본 제공 예외 클래스 외에도, 사용자가 예외 클래스를 정의할 수 있습니다.

사용자 정의 예외 클래스

#include <iostream>
#include <string>
using namespace std;

class MyException {
private:
    string message;
public:
    MyException(string msg) : message(msg) {}
    string what() const { return message; }
};

int main() {
    try {
        throw MyException("사용자 정의 예외 발생!");
    } catch (const MyException& e) {
        cout << "예외 발생: " << e.what() << endl;
    }

    return 0;
}

출력 예시

예외 발생: 사용자 정의 예외 발생!

예제 3: 다중 예외 처리

여러 유형의 예외를 처리하려면, 여러 개의 catch 블록을 사용할 수 있습니다.

#include <iostream>
using namespace std;

int main() {
    try {
        int x;
        cout << "정수를 입력하세요: ";
        cin >> x;

        if (x == 0) {
            throw 0;
        } else if (x < 0) {
            throw "음수는 입력할 수 없습니다.";
        }

        cout << "결과: " << 100 / x << endl;
    } catch (int e) {
        cout << "예외 발생: 0으로 나눌 수 없습니다." << endl;
    } catch (const char* e) {
        cout << "예외 발생: " << e << endl;
    }

    return 0;
}

출력 예시

  1. 입력: 0
    • 출력: 예외 발생: 0으로 나눌 수 없습니다.
  2. 입력: -5
    • 출력: 예외 발생: 음수는 입력할 수 없습니다.

예제 4: 표준 예외 클래스

C++ 표준 라이브러리는 다양한 예외 클래스를 제공합니다. 이러한 클래스는 <stdexcept> 헤더에 정의되어 있습니다.

주요 표준 예외 클래스

  • std::exception: 모든 표준 예외 클래스의 기본 클래스
  • std::runtime_error: 런타임 오류
  • std::logic_error: 논리적 오류

표준 예외 사용 예제

#include <iostream>
#include <stdexcept>
using namespace std;

int main() {
    try {
        throw runtime_error("런타임 오류 발생!");
    } catch (const runtime_error& e) {
        cout << "예외 발생: " << e.what() << endl;
    } catch (const exception& e) {
        cout << "알 수 없는 예외 발생: " << e.what() << endl;
    }

    return 0;
}

출력 예시

예외 발생: 런타임 오류 발생!

주의 사항

  1. catch 순서

    • 예외를 처리하는 catch 블록은 순서가 중요합니다.
    • 일반적으로 구체적인 예외를 먼저 처리하고, 더 포괄적인 예외를 나중에 처리해야 합니다.
  2. 예외 객체 복사

    • 예외 객체는 기본적으로 복사됩니다. 따라서 예외 객체가 크거나 복사 비용이 클 경우, 포인터나 참조를 사용하는 것이 효율적입니다.
  3. 예외는 남발하지 않기

    • 모든 오류를 예외로 처리하면 코드가 복잡해지고 비효율적일 수 있습니다. 적절한 상황에서만 사용하세요.

결론

이번 포스팅에서는 C++의 예외 처리에 대해 기본 개념부터 고급 활용까지 살펴보았습니다. 예외 처리는 안정적인 프로그램 개발을 위해 필수적인 기술이며, 이를 잘 활용하면 복잡한 오류 상황을 효과적으로 처리할 수 있습니다.

반응형

'cpp' 카테고리의 다른 글

C++ 멀티스레드 프로그래밍  (0) 2024.12.21
C++ 파일 입출력 심화  (0) 2024.12.21
C++ STL(Standard Template Library)  (0) 2024.12.20
C++ 템플릿 - 제네릭 프로그래밍  (0) 2024.12.20
C++ 네임스페이스(namespace)  (0) 2024.12.20